我想计算每个Id的列Act中值序列的出现次数。
数据帧:
a = {'id': [1, 1, 1, 1, 2, 2, 2, 2],
'Act': ['A', 'B', 'A', 'A', 'B', 'B', 'A', 'B']}
输出将计入每个不同id的序列:
Seq |计数
A - A | 1
A - B | 2
B - B | 1
B - A | 2
答案 0 :(得分:1)
您可以shift
与groupby
一起为每个 id 创建后继者,从而创建一个代表序列的列。然后,您可以在组内使用pd.value_counts
来计算序列数,如下所示:
df = pd.DataFrame({'id': [1, 1, 1, 1, 2, 2, 2, 2],
'Act': ['A', 'B', 'A', 'A', 'B', 'B', 'A', 'B']})
print(df)
Act id
0 A 1
1 B 1
2 A 1
3 A 1
4 B 2
5 B 2
6 A 2
7 B 2
# shift `Act` within id groups to get successor
df["Act Shifted"] = df.groupby("id").shift(-1)
# concatenate predeccesor and successor to get sequence column
df["Seq"] = df["Act"].str.cat(df["Act Shifted"], " - ")
print(df)
Act id Act Shifted Seq
0 A 1 B A - B
1 B 1 A B - A
2 A 1 A A - A
3 A 1 NaN NaN
4 B 2 B B - B
5 B 2 A B - A
6 A 2 B A - B
7 B 2 NaN NaN
现在只需在群组中计算:
# group by id and count sequences
df.groupby("id")["Seq"].apply(pd.value_counts)
id
1 A - A 1
A - B 1
B - A 1
2 B - B 1
A - B 1
B - A 1
Name: Seq, dtype: int64
如果您想获得序列计数而不考虑id,请删除groupby
:
df["Seq"].value_counts()
A - B 2
B - A 2
B - B 1
A - A 1
Name: Seq, dtype: int64
答案 1 :(得分:0)
尝试:
import pandas as pd
pd.Series(list(zip(a['Act'], a['Act'][1:]))).value_counts()
答案 2 :(得分:0)
单行:
df = pd.DataFrame({'id': [1, 1, 1, 1, 2, 2, 2, 2],
'Act': ['A', 'B', 'A', 'A', 'B', 'B', 'A', 'B']})
df['Act'].str.cat(df.groupby('id').shift(-1)['Act'], ' - ').value_counts().sort_index()
结果:
A - A 1
A - B 2
B - A 2
B - B 1
Name: Act, dtype: int64