Ich habe folgenden Datenrahmen:

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

Meine Spalten haben Muster von 'I I I' und 'O O O', die überall verteilt sind.

Ich möchte die Anzahl der Vorkommen von 'I I I' und 'O O O' in jeder Spalte zählen.

Ich weiß, dass ich jede Zeile jeder Spalte durchlaufen kann, aber dies ist ein sehr großer Datenrahmen.

Hat jemand 1) einen effizienteren Weg, dies zu tun und 2) einen pythonischeren Weg, dies zu tun?

Vielen Dank.

1
Windstorm1981 18 Apr. 2018 im 01:13

4 Antworten

Beste Antwort

Nehmen Sie zum Beispiel die Spalte "Jack" und das Muster "I I I".

Durch Schalten bekommen wir

>>> (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

So

((df.Jack == df.Jack.shift(1)) & (df.Jack == df.Jack.shift(2)) & (df.Jack == 'I')).sum() 

Gibt die Anzahl der Vorkommen des Musters in der Spalte an.

Sie können dies leicht an den anderen Mustern und Spalten ändern.

Beachten Sie, dass "I I I I" als das Muster gilt, das zweimal auftritt (überlappt).

2
Ami Tavory 17 Apr. 2018 im 22:25

Was ich tun werde

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 Apr. 2018 im 22:54

IIUC:

Sie zählen, wie oft III oder OOO auftritt. Ich würde die Saiten zusammenfassen und zählen

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 

Sie werden feststellen, dass dies 'IIII' als eine Instanz von 'III' zählt.

1
Ami Tavory 18 Apr. 2018 im 06:43

Sie können pd.value_counts anwenden Wenn Sie mehr als nur I und O haben, können Sie diese Werte auch in jeder Spalte Ihres Datenrahmens leicht zählen

df.apply(pd.value_counts)

   Jack  Joe  Mary
I     6    5     6
O     4    5     4
0
DJK 18 Apr. 2018 im 00:30