Eu quero contar a ocorrência de uma string em uma coluna dataframe de pandas agrupados.
Suponha que eu tenha o seguinte Dataframe:
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
Primeiro, quero agrupar por catA
e catB
. E para cada um desses grupos eu quero contar a ocorrência de RET
no scores
coluna.
O resultado deve ser algo como isto:
catA catB RET
A X 1
A Y 1
B Z 2
O agrupamento por duas colunas é fácil: grouped = df.groupby(["catA", "catB"])
Mas o que vem depois?
Respostas:
10 para resposta № 1Ligar apply
na coluna "pontuações" no groupby
objeto e usar o vectorise str
método contains
, use isso para filtrar group
e ligue 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
Para atribuir como coluna use transform
para que a agregação retorne uma série com o índice alinhado ao df original:
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