如何删除重复条目但保留第一行选定列值和最后一行选定列值?

2024-05-03 05:35:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这是我们的数据经过计算后在最后的数据帧中的样子

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

我想删除基于供应商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)

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


Tags: 数据代码iddate图表条目purchasevendor
1条回答
网友
1楼 · 发布于 2024-05-03 05:35:56

^{}与为输出的每列指定的^{}^{}^{}一起使用:

注意:谢谢@Erfan-如果需要,使用minimal和maximum列代替first和last将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

相关问题 更多 >