在不迭代Python的情况下计算大型数据帧中的模式出现次数

在不迭代Python的情况下计算大型数据帧中的模式出现次数,python,pandas,iteration,Python,Pandas,Iteration,我有以下数据帧: 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 .... 我的专栏中散布

我有以下数据帧:

    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
      ....
我的专栏中散布着“I”和“O”的模式

我想计算每列中出现“I”和“O”的次数

我知道我可以遍历每列的每一行,但这是一个非常大的数据帧

有没有人有1)更有效的方法和2)更通灵的方法

谢谢。

以“Jack”列和“I”模式为例

通过换档,我们可以

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

给出阵列在列中的出现次数

您可以轻松地将其修改为其他模式和列

请注意,“I”将计为出现两次(交错)的图案

以“Jack”列和“I”模式为例

通过换档,我们可以

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

给出阵列在列中的出现次数

您可以轻松地将其修改为其他模式和列

请注意,“I”将计为出现两次(交错)的图案

我要做什么

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
我会怎么做

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
您可以应用于数据帧的每一列,这样,如果您不仅仅有I和O,那么您也可以轻松地计算这些值

df.apply(pd.value_counts)

   Jack  Joe  Mary
I     6    5     6
O     4    5     4
您可以应用于数据帧的每一列,这样,如果您不仅仅有I和O,那么您也可以轻松地计算这些值

df.apply(pd.value_counts)

   Jack  Joe  Mary
I     6    5     6
O     4    5     4
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 
您会注意到,这将
'III'
计算为
'III'

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'
的一个实例,谢谢。说到你说的‘我’数到两次——我怎样才能消除?我正在寻找精确(且仅)3个连续I’s或O’s轨迹的精确模式。说到你说的‘我’数到两次——我怎样才能消除?我在寻找精确(且仅)3个连续I或O的精确模式
'IIIIII'。计数('III')
计数
2
。如果我理解正确,问题就解决了。不过我可能误解了。不,我想你是对的。这是一个非常好的解决方法,就我个人而言,我不知道
count
的行为。我认为这应该是公认的答案,FWIW。
'iiii'。count('III')
counts
2
。如果我理解正确,问题就解决了。不过我可能误解了。不,我想你是对的。这是一个非常好的解决方法,就我个人而言,我不知道
count
的行为。我认为这应该是公认的答案,FWIW。