J'ai le dataframe suivant:
Jack Joe Mary
1 I O O
2 I O I
3 I I I
4 O I I
5 O I O
6 I O O
7 I O I
8 I O I
9 O I I
10 O I O
....
Mes colonnes ont des motifs de «I I I» et «O O O» dispersés partout.
Je veux compter le nombre d'occurrences de «I I I» et «O O O» dans chaque colonne.
Je sais que je peux parcourir chaque ligne de chaque colonne, mais c'est une très grande trame de données.
Quelqu'un at-il 1) un moyen plus efficace de le faire et 2) un moyen plus pythonique de le faire?
Merci.
4 réponses
Prenez la colonne "Jack" et le motif "I I I", par exemple.
En utilisant le décalage, nous obtenons
>>> (df.Jack == df.Jack.shift(1)) & (df.Jack == df.Jack.shift(2)) & (df.Jack == 'I')
1 False
2 False
3 True
4 False
5 False
6 False
7 False
8 True
9 False
10 False
Name: Jack, dtype: bool
Donc
((df.Jack == df.Jack.shift(1)) & (df.Jack == df.Jack.shift(2)) & (df.Jack == 'I')).sum()
Donne le nombre d'occurrences du motif dans la colonne.
Vous pouvez facilement le modifier pour les autres modèles et colonnes.
Notez que "I I I I" compterait comme le motif se produisant deux fois (entrelacé).
Ce que je ferai
s=(df.shift()==df).ne(True).cumsum()# create the group key, class all continue value to one group
for x in s.columns:
print(x,df[x].groupby(s[x]).apply(''.join).isin(['III','OOO']).sum())
Jack 2
Joe 2
Mary 2
IIUC:
Vous comptez le nombre de fois où III
ou OOO
se produit. Je concatrais les cordes et je comptais
s = df.sum()
pd.concat({k: s.str.count(k) for k in ['III', 'OOO']}).unstack()
Jack Joe Mary
III 2 1 2
OOO 0 1 0
Vous remarquerez que cela compte 'IIII'
comme une instance de 'III'
.
Vous pouvez appliquer pd.value_counts
à chaque colonne de votre dataframe, de cette façon si vous avez plus que juste I et O, vous pouvez facilement compter ces valeurs aussi
df.apply(pd.value_counts)
Jack Joe Mary
I 6 5 6
O 4 5 4
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.