如何在熊猫中执行选择性 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 ...
然后我想为每一列分配一个True
或False
,具体取决于它的内部值是否大于一个常数值(比如说 > 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
,最后计数True
s 通过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()?的主要内容,如果未能解决你的问题,请参考以下文章