Python 如何使用groupby在组上添加顺序计数器列
我觉得有比这更好的方法:Python 如何使用groupby在组上添加顺序计数器列,python,pandas,Python,Pandas,我觉得有比这更好的方法: import pandas as pd df = pd.DataFrame( [['A', 'X', 3], ['A', 'X', 5], ['A', 'Y', 7], ['A', 'Y', 1], ['B', 'X', 3], ['B', 'X', 1], ['B', 'X', 3], ['B', 'Y', 1], ['C', 'X', 7], ['C', 'Y', 4], ['C', 'Y', 1], ['C', 'Y', 6]],
import pandas as pd
df = pd.DataFrame(
[['A', 'X', 3], ['A', 'X', 5], ['A', 'Y', 7], ['A', 'Y', 1],
['B', 'X', 3], ['B', 'X', 1], ['B', 'X', 3], ['B', 'Y', 1],
['C', 'X', 7], ['C', 'Y', 4], ['C', 'Y', 1], ['C', 'Y', 6]],
columns=['c1', 'c2', 'v1'])
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
有没有避免回调的方法?使用cumcount()
,请参阅文档
如果您希望从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
这可能有用
df = df.sort_values(['userID', 'date'])
grp = df.groupby('userID')['ItemID'].aggregate(lambda x: '->'.join(tuple(x))).reset_index()
print(grp)
它将创建这样的序列
如何将计数添加为一个额外的列?@Boris Use
df['seq']=df.groupby(['c1','c2']).cumcount()
不是OP,但非常感谢您的回答。假设cumcount()
的结果始终与原始数据帧具有相同的长度,并且您按要进行cumcount的列分组,这样安全吗?@BowenLiu似乎是一个非常安全的假设,因为我们正在计算行数
df = df.sort_values(['userID', 'date'])
grp = df.groupby('userID')['ItemID'].aggregate(lambda x: '->'.join(tuple(x))).reset_index()
print(grp)