簡體   English   中英

在不迭代Python熊貓的情況下計算大型數據框中的模式出現次數

[英]Counting Pattern Occurrences in a Large Data frame without Iterating Python Pandas

我有以下數據框:

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

我的專欄各處散布着“ III”和“ OOO”的圖案。

我想計算每列中“ III”和“ OOO”的出現次數。

我知道我可以遍歷每一列的每一行,但這是一個非常大的數據框。

有沒有人有1)執行此操作的更有效方法和2)執行此操作的更Python的方法?

謝謝。

以“ Jack”列和“ III”模式為例。

使用移位,我們得到

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

所以

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

給出該模式在列中的出現次數。

您可以輕松地將其修改為其他模式和列。

注意,“ IIII”將計為兩次出現的模式(交錯)。

我將要做的

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:

您正在計算IIIOOO發生的次數。 我會串起來算數

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 

您會注意到,這將'IIII'視為'III'一個實例。

您可以將pd.value_counts應用於數據pd.value_counts的每一列,這樣,如果您不僅擁有I和O,還可以輕松計算這些值

df.apply(pd.value_counts)

   Jack  Joe  Mary
I     6    5     6
O     4    5     4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM