枚举DataFrame中每个组的每一行

Gre*_*eda 11 python pandas

在pandas中,如何添加一个基于给定分组枚举行的新列?

例如,假设以下DataFrame:

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
Run Code Online (Sandbox Code Playgroud)

我想添加一个col_c根据分组col_a和排序给我的"组"的第N行col_b.

期望的输出:

  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
Run Code Online (Sandbox Code Playgroud)

我很难接受col_c.您可以进行正确的分组和排序.sort_index(by=['col_a', 'col_b']),现在是进入新列并标记每一行的问题.

And*_*den 17

暨计数,正是这种情况:

df['col_c'] = g.cumcount()
Run Code Online (Sandbox Code Playgroud)

正如它在文档中所说:

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


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

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

def add_col_c(x):
    x['col_c'] = np.arange(len(x))
    return x
Run Code Online (Sandbox Code Playgroud)

首先按列col_a排序:

In [11]: df.sort('col_a', inplace=True)
Run Code Online (Sandbox Code Playgroud)

然后在每个组中应用此功能:

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
Run Code Online (Sandbox Code Playgroud)

为了让1,2,...你使用couls np.arange(1, len(x) + 1).