【问题标题】:Select rows based on condition on rows and columns根据行和列的条件选择行
【发布时间】:2021-05-19 08:43:25
【问题描述】:

您好,我有一个要清理的 pandas 数据框。这是一个示例:

IDBILL IDBUYER BILL DATE
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 BILL DATE
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

提前谢谢你

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    首先使用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
    

    【讨论】:

    • 最简单的解决方案,如果他只想要最小值,但我不确定是否能解决:并且其账单 ID 彼此跟随部分,如果这实际上与解决方案。
    • @Anurag Dabas-我们可能不需要新列DAY.....df['DATE'] = pd.to_datetime(df.DATE) df = df.groupby(['DATE', 'IDBUYER'], sort=False)[['IDBILL','BILL']].min().reset_index()
    • @Uts 是的,你是对的,所以我修复了它...谢谢你注意到 :)
    • 与@Andreas 相同的评论,它有效,但没有办法控制 IDBILL 需要互相关注以删除一个?
    • 对不起,我不明白这一行there a way to control the need for IDBILLs to follow each other in order to delete one?请解释一下
    【解决方案2】:

    您可以尝试仅保留最低条目的最小值,这是 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 2016-11-02
      • 1970-01-01
      • 2017-01-18
      • 1970-01-01
      相关资源
      最近更新 更多