Groupby Pandas Python的自定义排序顺序功能

时间:2019-05-08 03:22:50

标签: python python-3.x pandas pandas-groupby

比方说,我有一个如下所示的分组数据框(它是通过初始的df.groupby(df["A"]).apply(some_func)获得的,其中some_func返回的是数据框本身)。第二列是multiindex创建的groupby的第二级。

A   B C
1 0 1 8
  1 3 3
2 0 1 2
  1 2 2
3 0 1 3
  1 2 4

我想订购适用于组的自定义函数的结果。

在此示例中,我们假设函数为

def my_func(group):
    return sum(group["B"]*group["C"])

然后我希望返回排序操作的结果

A   B C
2 0 1 2
  1 2 2
3 0 1 3
  1 2 4
1 0 1 8
  1 3 3

2 个答案:

答案 0 :(得分:0)

IIUC reindexapply之后,然后用argsort

idx=df.groupby('A').apply(my_func).reindex(df.index.get_level_values(0))
df.iloc[idx.argsort()]
Out[268]: 
     B  C
A       
2 0  1  2
  1  2  2
3 0  1  3
  1  2  4
1 0  1  8
  1  3  3

答案 1 :(得分:0)

这是基于@ Wen-Ben的出色回答,但使用sort_values来维护组内/组间订单。

df['func'] = (groups.apply(my_func)
              .reindex(df.index.get_level_values(0))
              .values)

(df.reset_index()
 .sort_values(['func','A','i'])
 .drop('func', axis=1)
 .set_index(['A','i']))

注意idx.argsort()的默认算法quicksort不稳定。这就是为什么@ Wen-Ben的答案对于复杂的数据集失败的原因。您可以使用idx.argsort(kind='mergesort')进行稳定排序,即在出现并列值时保持原始顺序。