如何使用 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 在组上添加顺序计数器列的主要内容,如果未能解决你的问题,请参考以下文章