考虑以下数据框:
>>> import pandas as pd
>>> df = pd.DataFrame({'group': list('aaabbabc')})
>>> df
group
0 a
1 a
2 a
3 b
4 b
5 a
6 b
7 c
我想计算每个组发生的累计次数。我想要的输出如下:
>>> df
group n
0 a 0
1 a 1
2 a 2
3 b 0
4 b 1
5 a 3
6 b 2
7 c 0
我最初的做法是做这样的事情:
df['n'] = df.groupby('group').apply(lambda x: list(range(x.shape[0])))
基本上为每个组分配一个长度为 n 的数组,零索引。但事实证明这很难转换和加入。
答案 0 :(得分:5)
您可以使用groupby
+ cumcount
和横向concat
新列:
>>> pd.concat([df, df.group.groupby(df.group).cumcount()], axis=1).rename(columns={0: 'n'})
group n
0 a 0
1 a 1
2 a 2
3 b 0
4 b 1
5 a 3
6 b 2
7 c 0
答案 1 :(得分:3)
只需在列名称上使用groupby
,在这种情况下group
,然后应用cumcount
,最后在数据框中添加一个包含结果的列。
df['n']=df.groupby('group').cumcount()
group n
0 a 0
1 a 1
2 a 2
3 b 0
4 b 1
5 a 3
6 b 2
7 c 0
答案 2 :(得分:1)
您可以通过传递apply
表达式作为参数来使用lambda
方法。
我们的想法是,您需要找到count
的{{1}}作为前一行中group
的外观的数量。
group
输出
df['n'] = df.apply(lambda x: list(df['group'])[:int(x.name)].count(x['group']), axis=1)
注意: group n
0 a 0
1 a 1
2 a 2
3 b 0
4 b 1
5 a 3
6 b 2
7 c 0
方法是在cumcount
函数的帮助下构建的。
您可以在pandas documentation中阅读此内容。