[英]How to sort a multindex pandas dataframe on an overall group level followed by within the group?
假设我有以下数据框:
import pandas as pd
tuples = [('A', 'AA'), ('A', 'AB'), ('B', 'BA'), ('B', 'BB'),
('C', 'CA'), ('C', 'CB')]
index = pd.MultiIndex.from_tuples(tuples,
names=['first_level', 'second_level'])
input_df = pd.DataFrame([100, 500, 200, 50, 3000, 10000],
columns=['amount'], index=index)
input_df
amount
first_level second_level
A AA 100
AB 500
B BA 200
BB 50
C CA 3000
CB 10000
我想要做的是基于两个条件进行排序:(1)跨first_level
总体的总量,然后(2)按每个second_level
内的second_level
。
换句话说,我想要这样的东西:
tuples = [('C', 'CB'), ('C', 'CA'), ('A', 'AB'),
('A', 'AA'), ('B', 'BA'), ('B', 'BB'), ]
index = pd.MultiIndex.from_tuples(tuples,
names=['first_level', 'second_level'])
output_df = pd.DataFrame([10000, 3000, 500, 100, 200, 50],
columns=['amount'], index=index)
output_df
amount
first_level second_level
C CB 10000
CA 3000
A AB 500
AA 100
B BA 200
BB 50
如您所见,C组的金额最大(13000),其次是A组(600),然后是B组(250)。 在每个组中,second_level是基于数量进行组织的。
我已经想出一种方法,但是由于需要聚合,联接和使用索引,它感觉太复杂了:
overall_group_amounts = input_df.groupby(['first_level']) \
.sum() \
.rename(columns={'amount': 'overall_amounts'})
pd.merge(overall_group_amounts, input_df.reset_index('second_level'), on='first_level') \
.sort_values(['overall_amounts', 'amount', 'first_level'], ascending=[False, False, True]) \
.drop('overall_amounts', axis='columns') \
.set_index('second_level', append=True)
我的问题是:是否有解决此问题的更好方法?
您可以通过对每个组进行求和来创建临时排序键,然后同时按键和数量进行排序:
(
df.assign(sk=df.groupby(level=0).amount.transform(sum))
.sort_values(by=['sk','amount'], ascending=False)
.drop('sk', 1)
)
amount
first_level second_level
C CB 10000
CA 3000
A AB 500
AA 100
B BA 200
BB 50
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.