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.

1
Windstorm1981 18 avril 2018 à 01:13

4 réponses

Meilleure réponse

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é).

2
Ami Tavory 17 avril 2018 à 22:25

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
2
YOBEN_S 17 avril 2018 à 22:54

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'.

1
Ami Tavory 18 avril 2018 à 06:43

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
0
DJK 18 avril 2018 à 00:30