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

发布于 2021-02-02 23:23:13

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

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

有没有一种方法可以避免回调?

关注者
0
被浏览
149
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    使用cumcount(),请参阅此处的文档

    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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看