【问题标题】:Pandas Groupby Conditional FilteringPandas Groupby 条件过滤
【发布时间】:2018-07-22 00:19:28
【问题描述】:

我有一个类似于下面的大型数据框。我想 Groupby '帐户',让 Groupby 只保留那些组中存在“等级”的组(该“帐户”组中的至少一条记录的“等级”大于 0)。
在此示例中,按“帐户”分组后,应该只剩下四个组 (1,3,4,5)。

如何在 Pandas 中做到这一点?

store = {'account': ['1', '1', '2', '2', '3', '4', '5'],
    'sales': [150, 200, 50,100, 125, 250, 300 ],
    'employees': [3, 5, 1,2, 3,5,7 ],
    'grade': [80, 90, '','' ,75, 60,85]}
df = pd.DataFrame(store)
df.groupby(['account'])

【问题讨论】:

    标签: python python-3.x filtering conditional-statements pandas-groupby


    【解决方案1】:

    听起来你想要DataFrameGroupBy.filter,在你的情况下可以归结为

    df.groupby('account').filter(lambda x: any(x.grade))
    

    例如(我稍微修改了您的输入以涵盖一些边缘情况):

    In [14]: df
    Out[14]:
      account  employees grade  sales
    0       1          3    80    150
    1       1          5          200
    2       2          1           50
    3       2          2    60    100
    4       3          3          125
    5       4          5    60    250
    6       5          7    85    300
    
    In [15]: df.groupby('account').filter(lambda x: any(x.grade))
    Out[15]:
      account  employees grade  sales
    0       1          3    80    150
    1       1          5          200
    2       2          1           50
    3       2          2    60    100
    5       4          5    60    250
    6       5          7    85    300
    

    【讨论】:

    • 很好,工作。我还是新手,是“过滤”上下文吗?例如在这个 Groupby 中,默认是在组“内”搜索,而 x.grade 正在查看组的所有“等级”?
    • 是的,最多一个技术细节:any 将在遇到非空等级时短路并返回True,因此感觉您不一定要查看所有其中。
    • 要了解正在发生的事情,你可以def f(x): print(x); return any(x.grade) 而不是df.groupby('account').filter(f);这样,您将看到谓词最终如何应用于每个组。
    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2019-02-06
    • 2022-01-17
    • 2016-08-28
    • 2021-03-05
    • 2017-01-20
    • 2013-07-10
    • 1970-01-01
    相关资源
    最近更新 更多