按索引“ 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 .:欢迎编辑标题,我觉得它有些笨拙。
答案 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