我想计算每个Id的Act列中值序列出现的次数。
数据框:
a = {'id': [1, 1, 1, 1, 2, 2, 2, 2],
'Act': ['A', 'B', 'A', 'A', 'B', 'B', 'A', 'B']}
输出将计算每个不同 id 的序列:
序列|计数
A - A | 1
A - B | 2
B - B | 1
B - A | 2
最佳答案
您可以将 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
关于python - Pandas - 计算每个 id 中的值序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49189175/