按组开始计数为零

时间:2018-05-04 12:45:44

标签: python pandas

考虑以下数据框:

>>> 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 的数组,零索引。但事实证明这很难转换和加入。

3 个答案:

答案 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中阅读此内容。