我有以下数据框:
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方式来做到这一点?
感谢。
答案 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:
您正在计算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 :(得分:0)
您可以将pd.value_counts
应用于数据框的每一列,如果您拥有的不仅仅是I和O,那么您也可以轻松地计算这些值
df.apply(pd.value_counts)
Jack Joe Mary
I 6 5 6
O 4 5 4