在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)
.