你好,我有一个想要清理的 Pandas 数据框。这是一个例子:
IDBILL | IDBUYER | 比尔 | 日期 |
---|---|---|---|
001 | 768787 | 45 | 1897-07-24 |
002 | 768787 | 30 | 1897-07-24 |
005 | 786545 | 45 | 1897-08-19 |
008 | 657676 | 89 | 1989-09-23 |
009 | 657676 | 42 | 1989-09-23 |
010 | 657676 | 18 | 1989-09-23 |
012 | 657676 | 51 | 1990-03-10 |
016 | 892354 | 73 | 1990-03-10 |
018 | 892354 | 48 | 1765-02-14 |
我想删除最高的帐单(并保留最低的帐单,当同一天的帐单由同一 IDBUYER 开具且帐单 ID 相互跟随时。 要得到这个:
IDBILL | IDBUYER | 比尔 | 日期 |
---|---|---|---|
002 | 768787 | 30 | 1897-07-24 |
005 | 786545 | 45 | 1897-08-19 |
010 | 657676 | 18 | 1989-09-23 |
012 | 657676 | 51 | 1990-03-10 |
016 | 892354 | 73 | 1990-03-10 |
018 | 892354 | 48 | 1765-02-14 |
提前致谢
答案 0 :(得分:2)
首先使用 to_datetime()
方法将 'DATE' 列转换为 datetime dtype:
df['DATE'] = pd.to_datetime(df['DATE'])
尝试使用 groupby()
方法:
result=df.groupby(['IDBUYER',df['DATE'].dt.day],as_index=False)[['IDBILL','BILL','DATE']].min()
或
result=df.groupby(['DATE', 'IDBUYER'], sort=False)[['IDBILL','BILL']].min().reset_index()
result
的输出:
IDBUYER IDBILL BILL DATE
0 657676 12 51 1990-03-10
1 657676 8 18 1989-09-23
2 768787 1 30 1897-07-24
3 786545 5 45 1897-08-19
4 892354 16 73 1990-03-10
5 892354 18 48 1765-02-14
答案 1 :(得分:0)
您可以尝试仅保留最低条目的最小值,这是 idbill 的后续:
df['follow_up'] = df['IDBILL'].ne(df['IDBILL'].shift()+1).cumsum()
m = df.groupby(['IDBUYER', 'follow_up', df['DATE']])['BILL'].idxmin()
df.loc[sorted(m)]
# IDBILL IDBUYER BILL DATE follow_up
# 1 2 768787 30 1897-07-24 1
# 2 5 786545 45 1897-08-19 2
# 5 10 657676 18 1989-09-23 3
# 6 12 657676 51 1990-03-10 4
# 7 16 892354 73 1990-03-10 5
# 8 18 892354 48 1765-02-14 6