如何使用 Pandas groupby 在组上添加顺序计数器列

Posted

技术标签:

【中文标题】如何使用 Pandas groupby 在组上添加顺序计数器列【英文标题】:How to add sequential counter column on groups using Pandas groupby 【发布时间】:2014-06-19 13:24:45 【问题描述】:

我觉得有比这更好的方法:

import pandas as pd
df = pd.DataFrame(
    columns="   index    c1    c2    v1 ".split(),
    data= [
            [       0,  "A",  "X",    3, ],
            [       1,  "A",  "X",    5, ],
            [       2,  "A",  "Y",    7, ],
            [       3,  "A",  "Y",    1, ],
            [       4,  "B",  "X",    3, ],
            [       5,  "B",  "X",    1, ],
            [       6,  "B",  "X",    3, ],
            [       7,  "B",  "Y",    1, ],
            [       8,  "C",  "X",    7, ],
            [       9,  "C",  "Y",    4, ],
            [      10,  "C",  "Y",    1, ],
            [      11,  "C",  "Y",    6, ],]).set_index("index", drop=True)
def callback(x):
    x['seq'] = range(1, x.shape[0] + 1)
    return x
df = df.groupby(['c1', 'c2']).apply(callback)
print df

要实现这一点:

   c1 c2  v1  seq
0   A  X   3    1
1   A  X   5    2
2   A  Y   7    1
3   A  Y   1    2
4   B  X   3    1
5   B  X   1    2
6   B  X   3    3
7   B  Y   1    1
8   C  X   7    1
9   C  Y   4    1
10  C  Y   1    2
11  C  Y   6    3

有没有办法避免回调?

【问题讨论】:

【参考方案1】:

使用cumcount(),参见文档here

In [4]: df.groupby(['c1', 'c2']).cumcount()
Out[4]: 
0     0
1     1
2     0
3     1
4     0
5     1
6     2
7     0
8     0
9     0
10    1
11    2
dtype: int64

如果您想从 1 点开始订购

In [5]: df.groupby(['c1', 'c2']).cumcount()+1
Out[5]: 
0     1
1     2
2     1
3     2
4     1
5     2
6     3
7     1
8     1
9     1
10    2
11    3
dtype: int64

【讨论】:

如何将计数添加为额外的列? @Boris 使用df['seq'] = df.groupby(['c1', 'c2']).cumcount() 不是 OP,但非常感谢这个出色的答案。假设cumcount() 的结果将始终具有与原始数据帧相同的长度,并且您按要计算的列分组是否安全? @BowenLiu 似乎是一个非常安全的假设,因为我们正在计算行数【参考方案2】:

这可能有用

df = df.sort_values(['userID', 'date'])
grp = df.groupby('userID')['ItemID'].aggregate(lambda x: '->'.join(tuple(x))).reset_index()
print(grp)

它将创建一个这样的序列

【讨论】:

以上是关于如何使用 Pandas groupby 在组上添加顺序计数器列的主要内容,如果未能解决你的问题,请参考以下文章

数据分析—Pandas 中的分组聚合Groupby 高阶操作

在组内使用 pandas.shift()

Pandas:在组复杂问题中使用条件迭代和插入列

Pyspark groupby 然后在组内排序

pandas groupby同时添加和平均[重复]

如何在单个级别上添加新列时使用 pandas group-by?