首页 > 解决方案 > 如何删除重复条目但保留第一行选定列值和最后一行选定列值?

问题描述

我正在 periscopedata 中创建图表并使用 pandas 来得出我们的结果。从结果中删除重复项时,我遇到了困难。

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

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)

我如何编写这样的代码来删除重复项并保留上面示例中提到的第一个和最后一个。

标签: pythonpandas

解决方案


使用GroupBy.aggwith GroupBy.firstGroupBy.lastGroupBy.sum为输出的每一列指定:

注意:感谢@Erfan - 如果需要使用最小和最大列而不是第一个和最后一个将dict更改为{'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

推荐阅读