如何计算满足特定条件的熊猫 groupby 的值

Posted

技术标签:

【中文标题】如何计算满足特定条件的熊猫 groupby 的值【英文标题】:How to count the values of a pandas groupby that meet a certain condition 【发布时间】:2020-09-28 02:02:44 【问题描述】:

在开始之前,我想明确指出我的问题与Counting values that meet a condition 和Want to count the number of values in a column that meet a condition 不同。

请允许我解释一下。这是我的df:

test = pd.DataFrame('name':['joe','dan','betty','joe','dan','betty','joe','dan','betty','joe','dan','betty'],'points':[12,3,5,10,5,16,2,8,15,17,1,3])
test


   name points
0   joe   12
1   dan    3
2   betty  5
3   joe   10
4   dan    5
5   betty 16
6   joe    2
7   dan    8
8   betty 15
9   joe   17
10  dan    1
11  betty  3

我的目标是计算每个人有多少次得分低于 10 分,然后创建一个包含该值的新列。我尝试了以下方法并非常接近:

test['<10'] = test[test['points'] < 10].groupby('name')['points'].transform('count')
test


    name    points  <10
0   joe       12    NaN
1   dan        3    4.0
2   betty      5    2.0
3   joe       10    NaN
4   dan        5    4.0
5   betty     16    NaN
6   joe        2    1.0
7   dan        8    4.0
8   betty     15    NaN
9   joe       17    NaN
10  dan        1    4.0
11  betty      3    2.0

我得到了我想要的值,但是由于我将数据框的子集设置为

【问题讨论】:

我能想到的一种长期方法是将所有 10 岁以下的 Joes 或 Dans 重命名为 Joe_1、Dan_1。然后添加它们的出现。一旦你用它们代替 NaN,你可以将 Dan_1 重新转换为 Dan 【参考方案1】:

您的代码仅选择 point &lt; 10 所在的行。逻辑是你需要直接在point &lt; 10的掩码上sumTrue 等价于1 并且False0。因此,对point &lt; 10 求和将返回True 的计数。从这个逻辑,你只需要 groupby 和做transform 来填充True 的计数到每个组

test['<10'] = (test['points'] < 10).groupby(test['name']).transform('sum')

Out[84]:
     name  points  <10
0     joe      12  1.0
1     dan       3  4.0
2   betty       5  2.0
3     joe      10  1.0
4     dan       5  4.0
5   betty      16  2.0
6     joe       2  1.0
7     dan       8  4.0
8   betty      15  2.0
9     joe      17  1.0
10    dan       1  4.0
11  betty       3  2.0

【讨论】:

太棒了,我会在 5 分钟内接受这个作为正确答案。你能解释一下我的代码和你的代码有什么不同吗?它们看起来几乎一模一样。 我同意这是一个很好的方法,但对于提出此类问题的人来说并不直观。 @bismo:我添加了更多解释【参考方案2】:

修复您的代码删除transform 并添加reindex

test['<10']=test[test['points'] < 10].groupby('name')['points'].count().reindex(test.name).values
test
     name  points  <10
0     joe      12    1
1     dan       3    4
2   betty       5    2
3     joe      10    1
4     dan       5    4
5   betty      16    2
6     joe       2    1
7     dan       8    4
8   betty      15    2
9     joe      17    1
10    dan       1    4
11  betty       3    2

【讨论】:

以上是关于如何计算满足特定条件的熊猫 groupby 的值的主要内容,如果未能解决你的问题,请参考以下文章

熊猫数据框条件 .mean() 取决于特定列中的值

熊猫计数和求和特定条件

熊猫:groupby后如何获得特定的组? [复制]

Groupby 一列并计算另一列的条件?

如果满足条件,熊猫将值从一列复制到另一列

随着时间的推移,使用熊猫计算滚动窗口中唯一 id 的特定条件事件的数量