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

时间:2018-03-09 08:04:02

标签: 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的序列:

Seq |计数

A - A | 1

A - B | 2

B - B | 1

B - A | 2

3 个答案:

答案 0 :(得分:1)

您可以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

答案 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