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

时间:2018-04-17 22:13:32

标签: 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
      ....

我的专栏中散布着“我是我”和“O O O”的模式。

我想计算每列中'I I I'和'O O O'的出现次数。

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

有没有人有1)更有效的方法来做到这一点2)更多的pythonic方式来做到这一点?

感谢。

4 个答案:

答案 0 :(得分:2)

例如,以“杰克”栏和“我是我”模式为准。

使用移位,我们得到

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

给出列中模式的出现次数。

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

请注意,“I I I I”会计算为两次出现的模式(重叠)。

答案 1 :(得分: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

答案 2 :(得分:1)

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'的一个实例。

答案 3 :(得分:0)

您可以将pd.value_counts应用于数据框的每一列,如果您拥有的不仅仅是I和O,那么您也可以轻松地计算这些值

df.apply(pd.value_counts)

   Jack  Joe  Mary
I     6    5     6
O     4    5     4