[英]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:
您正在計算III
或OOO
發生的次數。 我會串起來算數
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.