Python 枚举数据帧中每个组的每一行

Python 枚举数据帧中每个组的每一行,python,pandas,Python,Pandas,在pandas中,如何添加一个新列,该列根据给定的分组枚举行 例如,假设以下数据帧: import pandas as pd import numpy as np a_list = ['A', 'B', 'C', 'A', 'A', 'C', 'B', 'B', 'A', 'C'] df = pd.DataFrame({'col_a': a_list, 'col_b': range(10)}) df col_a col_b 0 A 0 1 B 1 2

在pandas中,如何添加一个新列,该列根据给定的分组枚举行

例如,假设以下数据帧:

import pandas as pd
import numpy as np

a_list = ['A', 'B', 'C', 'A', 'A', 'C', 'B', 'B', 'A', 'C']
df = pd.DataFrame({'col_a': a_list, 'col_b': range(10)})
df
  col_a  col_b
0     A      0
1     B      1
2     C      2
3     A      3
4     A      4
5     C      5
6     B      6
7     B      7
8     A      8
9     C      9
我想添加一个
列c
,它根据
列a
的分组和
列b
的排序给出“组”的第n行

期望输出:

  col_a  col_b  col_c
0     A      0      1
3     A      3      2
4     A      4      3
8     A      8      4
1     B      1      1
6     B      6      2
7     B      7      3
2     C      2      1
5     C      5      2
9     C      9      3
我正在努力进入
col\u c
。您可以使用
.sort\u index(by=['col\u a','col\u b'])
进行适当的分组和排序,现在只需找到新的列并标记每一行。

在这种情况下:

df['col_c'] = g.cumcount()
正如文件中所说:

将每组中的每个项目编号,从0到该组的长度-1


原始答案(在定义cumcount之前)

您可以创建一个助手函数来执行此操作:

def add_col_c(x):
    x['col_c'] = np.arange(len(x))
    return x
按列colu_a进行第一次排序:

In [11]: df.sort('col_a', inplace=True)
然后在每个组中应用此功能:

In [12]: g = df.groupby('col_a', as_index=False)

In [13]: g.apply(add_col_c)
Out[13]:
  col_a  col_b  col_c
3     A      3      0
8     A      8      1
0     A      0      2
4     A      4      3
6     B      6      0
1     B      1      1
7     B      7      2
9     C      9      0
2     C      2      1
5     C      5      2

为了得到
1,2,…
您可以使用
np.arange(1,len(x)+1)

您可以定义自己的函数来处理:

In [58]: def func(x):
   ....:     x['col_c'] = x['col_a'].argsort() + 1 
   ....:     return x
   ....: 

In [59]: df.groupby('col_a').apply(func)
Out[59]: 
  col_a  col_b  col_c
0     A      0      1   
3     A      3      2   
4     A      4      3   
8     A      8      4   
1     B      1      1   
6     B      6      2   
7     B      7      3   
2     C      2      1   
5     C      5      2   
9     C      9      3

给出的答案都涉及为每个组调用一个python函数,如果您有许多组,那么向量化方法应该更快(我没有检查)

以下是我纯粹的建议:

In [5]: df.sort(['col_a', 'col_b'], inplace=True, ascending=(False, False))
In [6]: sizes = df.groupby('col_a', sort=False).size().values
In [7]: df['col_c'] = np.arange(sizes.sum()) - np.repeat(sizes.cumsum() - sizes, sizes)
In [8]: print df
  col_a  col_b  col_c
9     C      9      0
5     C      5      1
2     C      2      2
7     B      7      0
6     B      6      1
1     B      1      2
8     A      8      0
4     A      4      1
3     A      3      2
0     A      0      3

这基本上回答了这个问题——尽管gjreda要求列举按col_b排序的col_a。真棒,谢谢@AndyHayden。知道这将是一个groupby,但却不知道如何正确地应用它。