我正在用潜望镜数据创建图表,并做熊猫来得出我们的结果。从结果中删除重复项时,我遇到了困难。
这是我们的数据在计算后的最终数据框中的样子。
vendor_ID date opening purchase paid closing
B2345 01/01/2015 5 20 10 15
B2345 01/01/2015 15 50 20 45
B2345 02/01/2015 45 4 30 19
我想根据vendor_ID和日期删除重复的条目,但保持开始状态并保持最后一个状态结束
即我想要的预期结果
vendor_ID date opening purchase paid closing
B2345 01/01/2015 5 70 30 45
B2345 02/01/2015 45 4 30 19
我尝试下面的代码删除重复项,但这给了我们不同的错误。
df.drop_duplicates(subset=["vendor_ID", "date"], keep="last", inplace=True)
我如何编码这种方式来删除重复项,并保留上面示例中提到的第一个和最后一个。
最佳答案
将GroupBy.agg
与为每列指定的GroupBy.first
,GroupBy.last
和GroupBy.sum
一起使用以进行输出:
注意:感谢@Erfan-如果需要使用最小和最大列,而不是将first和last更改为{'opening':'min','purchase':'sum','paid':'sum', 'closing':'max'}
df1 = (df.groupby(["vendor_ID", "date"], as_index=False)
.agg({'opening':'first','purchase':'sum','paid':'sum', 'closing':'last'}))
print (df1)
vendor_ID date opening purchase paid closing
0 B2345 01/01/2015 5 70 30 45
1 B2345 02/01/2015 45 4 30 19
另外,如果不确定日期时间是否已排序:
df['date'] = pd.to_datetime(df['date'], dayfirst=True)
df = df.sort_values(["vendor_ID", "date"])
df1 = (df.groupby(["vendor_ID", "date"], as_index=False)
.agg({'opening':'first','purchase':'sum','paid':'sum', 'closing':'last'}))
print (df1)
vendor_ID date opening purchase paid closing
0 B2345 2015-01-01 5 70 30 45
1 B2345 2015-01-02 45 4 30 19
您还可以为
sum
所有没有前2个列的列创建动态字典,并用于第一个和最后一个:df['date'] = pd.to_datetime(df['date'], dayfirst=True)
df = df.sort_values(["vendor_ID", "date"])
d = {'opening':'first', 'closing':'last'}
sum_cols = df.columns.difference(list(d.keys()) + ['vendor_ID','date'])
final_d = {**dict.fromkeys(sum_cols,'sum'), **d}
df1 = df.groupby(["vendor_ID", "date"], as_index=False).agg(final_d).reindex(df.columns,axis=1)
print (df1)
vendor_ID date opening purchase paid closing
0 B2345 2015-01-01 5 70 30 45
1 B2345 2015-01-02 45 4 30 19