如何计算满足特定条件的熊猫 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 < 10
所在的行。逻辑是你需要直接在point < 10
的掩码上sum
。 True
等价于1
并且False
是0
。因此,对point < 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 的值的主要内容,如果未能解决你的问题,请参考以下文章