如果我只考虑索引的一个级别,熊猫会根据列的聚合对多索引进行排序

时间:2019-01-17 07:44:22

标签: python pandas multi-index

按索引“ city”对 city_sales_rep 数据框进行排序的最快方法是什么,请注意已存在多索引。索引的顺序应与第二个数据框 city 中的索引顺序完全相同。

是否有一种简便快捷的方法可以一次性进行排序?

A = pd.DataFrame(np.random.randint(2,10,(10,3))) 
A.columns = ['city','sales_rep','sales']

city_sales_rep = A.groupby(['city','sales_rep']).sum()

city = A.groupby(['city'])['sales'].sum().sort_values()

在我的示例中哪个导致 city_sales_rep

                sales
city sales_rep       
2    9              5
4    5              2
     7              5
     9              2
5    4              4
6    8              6
     9              9
7    2              2
     3              8
     6              4

城市

      sales
city       
5         4
2         5
4         9
7        14
6        15

这似乎可以满足我的要求,但效率却非常低:

city.join(city_sales_rep.reset_index(level=1),lsuffix='_x')[['sales_rep','sales']].reset_index().set_index(['city','sales_rep'])

P.S .:欢迎编辑标题,我觉得它有些笨拙。

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案,但不确定性能:

np.random.seed(2019)
A = pd.DataFrame(np.random.randint(2,10,(10,3))) 
A.columns = ['city','sales_rep','sales']

city_sales_rep = A.groupby(['city','sales_rep']).sum()
a = np.argsort(city_sales_rep.groupby(['city'])['sales'].transform('sum'))
city_sales_rep = city_sales_rep.iloc[a]
print (city_sales_rep)
                sales
city sales_rep       
8    2              7
7    2              8
6    2              9
9    6              4
     7              9
2    2              9
     4              9
     6              7
     7              5

另一个具有新列的解决方案:

city_sales_rep = A.groupby(['city','sales_rep']).sum()
city_sales_rep['new'] = city_sales_rep.groupby(['city'])['sales'].transform('sum')
city_sales_rep = city_sales_rep.sort_values('new')
print (city_sales_rep)
                sales  new
city sales_rep            
8    2              7    7
7    2              8    8
6    2              9    9
9    6              4   13
     7              9   13
2    2              9   30
     4              9   30
     6              7   30
     7              5   30

如果可能为不同的sum复制了cities并使用pandas 0.23.0+可以按级别和列一起排序,请检查docs

city_sales_rep = city_sales_rep.sort_values(['new','city'])
print (city_sales_rep)
                sales  new
city sales_rep            
8    2              7    7
7    2              8    8
6    2              9    9
9    6              4   13
     7              9   13
2    2              9   30
     4              9   30
     6              7   30
     7              5   30