我正在用潜望镜数据创建图表,并做熊猫来得出我们的结果。从结果中删除重复项时,我遇到了困难。

这是我们的数据在计算后的最终数据框中的样子。

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.firstGroupBy.lastGroupBy.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

10-06 13:08