【问题标题】:Keep rows of a pandas dataframe based on both row and column conditions根据行和列条件保留熊猫数据框的行
【发布时间】:2021-08-08 15:55:57
【问题描述】:

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

IDBILL IDBUYER BILL DATE
001 768787 45 1897-07-24
001 768787 67 1897-07-24
001 768787 98 1897-07-24
002 768787 30 1897-07-24
002 768787 15 1897-07-24
002 768787 12 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
020 892354 62 1765-02-14

我想删除最高的账单(并在同一天由同一 IDBUYER 制作账单时保留最低的账单,并且其账单 ID 彼此跟随。 要得到这个:

IDBILL IDBUYER BILL DATE
002 768787 30 1897-07-24
002 768787 15 1897-07-24
002 768787 12 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
020 892354 62 1765-02-14

提前谢谢你

【问题讨论】:

  • 为什么最后一行没有去掉?
  • 因为020没有跟在018后面,去掉它应该是019。
  • 当您说“删除最高账单”时,您的意思是按 IDBILL 汇总并删除较高金额吗?那么如果 IDBILL 002 的每张账单都有 100,它就会被删除,而 001 会留下来吗?
  • 例如,对于 001,您将 3 个中最低的账单与三个 002 中的最低账单进行比较。如果每个 002 的账单有 100 个,则三个 002 将被删除,而三个 001 会留下来。

标签: python pandas dataframe


【解决方案1】:

一种解决方案:

df = df.sort_values('BILL')
df.loc[df.assign(cc = df.groupby(['DATE','IDBUYER',df.groupby(['DATE','IDBUYER'])['IDBILL'].transform(lambda x: x.diff().gt(1).cumsum())]).cumcount(),cc2 = df.groupby(['DATE','IDBUYER','IDBILL']).transform('count'),floor = lambda x: ~(x['cc'].floordiv(x['cc2'],axis=0).astype(bool)))['floor']].sort_index()

【讨论】:

    猜你喜欢
    • 2019-04-01
    • 2018-12-22
    • 1970-01-01
    • 2022-01-25
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 2023-02-21
    相关资源
    最近更新 更多