如何在熊猫中执行选择性 groupby().count()?

Posted

技术标签:

【中文标题】如何在熊猫中执行选择性 groupby().count()?【英文标题】:How to perform a selective groupby().count() in pandas? 【发布时间】:2021-03-29 01:18:06 【问题描述】:

我正在努力在脚本中实现 pandas groupby().count() 和列平均计算的特殊组合,由于我的工作时间很紧,我决定在 Stack 上寻求帮助,希望有人会知道一个非常pythonic和面向pandas的解决方案,我可以添加到我的行李中。我提出的所有想法都有些草率,我不喜欢它们。

我有一个包含 500 多行和 80 多列的 pandas 数据框,如下所示:

ID  S1_R1   S1_R2   S2_R1   S2_R2  ... 
A   10      10      5       10     ...
A   9       10      0       0      ...
A   0       0       10      9      ...
B   6       10      0       0      ...
B   0       0       15      11     ...
C   5       12      0       0      ...

我想首先获得S* 列的平均值。我放了“S”,但实际上我有更长的字符串,我可以在类似grep 的操作中使用,吸收所有携带子字符串的人:

ID  S1      S2    ...
A   10      7.5   ...
A   9.5     0     ...
A   0       9.5   ...
B   8       0     ...
B   0       13    ...
C   8.5     0     ...

然后我想为每一列分配一个TrueFalse,具体取决于它的内部值是否大于一个常数值(比如说 > 0 或不):

ID  S1      S2      ...
A   True    True    ...
A   True    False   ...
A   False   True    ...
B   True    False   ...
B   False   True    ...
C   True    False   ...

然后我想groupby().count() ID 但只考虑那些在列中有True 的样本。结果应该是这样的:

ID   S1    S2   ...
A    2     2    ...
B    1     1    ...
C    1     0    ...

我目前正在使用数据框子集、合并、连接和 groupby().count() 的组合来执行所有这些步骤,但它看起来确实很糟糕,而且像意大利面条代码一样,所以我真的不喜欢我的东西已经完成了。最重要的是,我觉得我不能信任我从命令行传递给脚本的任何数据帧上的代码,它似乎不太可重现。

你能帮帮我吗?你能想到的最简洁、最 Pythonic 的解决方案是什么?

【问题讨论】:

【参考方案1】:

您可以将ID 转换为索引,然后创建连续的S* 列,获取每个S* 列的平均值,通过DataFrame.gt 进行比较以获得更大的0,最后计数Trues 通过sum

df = df.set_index('ID')

#here is simplify solution for grep data by values before _
df.columns = df.columns.str.split('_').str[0]

df = df.mean(axis=1, level=0).gt(0).sum(level=0)
print (df)
    S1  S2
ID        
A    2   2
B    1   1
C    1   0

【讨论】:

您的解决方案完美运行。非常感谢!如此整洁。喜欢它。

以上是关于如何在熊猫中执行选择性 groupby().count()?的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫中过滤 groupby 的结果

如何将*多个*功能应用于熊猫 groupby 应用?

如何在复杂的熊猫 groupby 中绘制图形?

如何在图表中绘制熊猫 groupby 值

熊猫如何根据条件在groupby中划分行列

如何在熊猫中的 groupby().mean() 之后获取索引值列表?