Python 枚举数据帧中每个组的每一行
在pandas中,如何添加一个新列,该列根据给定的分组枚举行 例如,假设以下数据帧: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
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,但却不知道如何正确地应用它。