根据行和列的条件选择行

时间:2021-05-19 08:43:25

标签: python pandas

你好,我有一个想要清理的 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

提前致谢

2 个答案:

答案 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