在不迭代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')
counts2
。如果我理解正确,问题就解决了。不过我可能误解了。不,我想你是对的。这是一个非常好的解决方法,就我个人而言,我不知道count
的行为。我认为这应该是公认的答案,FWIW。