簡體   English   中英

如何在整體組級別上,然后在組內對多大熊貓數據框進行排序?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM