python - Pandas - 计算每个 id 中的值序列

标签 python pandas dataframe count sequence

我想计算每个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

最佳答案

您可以将 shiftgroupby 结合使用,为每个 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/

相关文章:

python - 对每一行的 pandas 列进行排序

python - 通过 Popen 帮助 ping

python - 与 NA 左连接

r - 如何有效地合并两个数据集?

python - Pandas:使用 set_index() 将列设置为索引会创建一个子索引。为什么会发生这种情况以及如何消除它?

python 子类

python - 如何左对齐饼图?

python - 在 Pandas 中根据多个条件过滤 DataFrame

python - Pandas 数据帧 : alignment

python - 无法连接类型为 "<class ' numpy.ndarray'>"的对象;只有 pd.Series、pd.DataFrame 和 pd.Panel(已弃用)objs 有效