Pandas按列分组计算字符串出现次数

16

我想在一个分组的pandas数据框列中统计一个字符串的出现次数。

假设我有以下数据框:

catA    catB    scores
A       X       6-4 RET
A       X       6-4 6-4
A       Y       6-3 RET
B       Z       6-0 RET
B       Z       6-1 RET

首先,我想按catAcatB进行分组。对于每个组,我想计算scores列中RET出现的次数。

结果应该类似于这样:

catA    catB    RET
A       X       1
A       Y       1
B       Z       2

按照两列进行分组很容易:grouped = df.groupby(['catA', 'catB'])

但接下来要做什么呢?

1个回答

24

groupby 对象上调用 'scores' 列的 apply 方法,并使用向量化的 str 方法的 contains,用它来过滤 group 并调用 count

In [34]:    
df.groupby(['catA', 'catB'])['scores'].apply(lambda x: x[x.str.contains('RET')].count())

Out[34]:
catA  catB
A     X       1
      Y       1
B     Z       2
Name: scores, dtype: int64

使用transform将其分配为列,以便聚合返回与原始df对齐的索引系列:

In [35]:
df['count'] = df.groupby(['catA', 'catB'])['scores'].transform(lambda x: x[x.str.contains('RET')].count())
df

Out[35]:
  catA catB   scores count
0    A    X  6-4 RET     1
1    A    X  6-4 6-4     1
2    A    Y  6-3 RET     1
3    B    Z  6-0 RET     2
4    B    Z  6-1 RET     2

这样做会永久存储在一个新列中吗?如果不是,如何将其存储为新列? 我想要做的是,只有当计数大于某个特定数字时,才想要显示输出。 - beta
我如何搜索两个不同的字符串?所以str可以包含RETASDF?然后我需要一个正则表达式对吗? - beta
1
使用 x.str.contains('RET|ASDF'),同时您应该发布完整的需求,更新您的问题,并将您的问题限制在每个问题上而不是增加您的问题。 - EdChum
抱歉,我在提问时不知道有这个要求。现在没问题了... - beta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接