簡體   English   中英

將pandas多索引數據幀重塑為多列

[英]Reshaping pandas multi-index dataframe to multi-column

我一直試圖重塑給定的熊貓數據框架兩天。 我想將我的多索引數據幀轉換為多列形式,但是使用pd.stack(),pd.unstack(),pd.melt(),...失敗了很多。

我有一個通用的多索引數據框,給出如下:

import pandas

df = pandas.DataFrame({'Scenario' : ['Scen1', 'Scen1', 'Scen1', 'Scen1', 
                                     'Scen1', 'Scen1', 'Scen2','Scen2',
                                     'Scen2', 'Scen2','Scen2','Scen2'],
                                     'Tech' : ['x', 'y', 'z', 'x', 'y', 'z', 
                                               'x', 'y', 'z', 'x', 'y', 'z'],
                                     'Year' : ['2010', '2010', '2010', 
                                               '2015', '2015', '2015',
                                               '2010', '2010', '2010', 
                                               '2015', '2015', '2015'],
                                     'Sum' : ['1', '2', '3', '4', 
                                              '5', '6', '7', '8', 
                                              '9', '10', '11', '12']})

df.set_index(['Scenario', 'Tech'], inplace=True)
print(df)

                   Sum  Year                                                                                                 
Scenario Tech                                                                                                           
Scen1    x      1  2010                                                                                                 
         y      2  2010                                                                                                 
         z      3  2010                                                                                                 
         x      4  2015                                                                                                 
         y      5  2015                                                                                                 
         z      6  2015                                                                                                 
Scen2    x      7  2010                                                                                                 
         y      8  2010                                                                                                 
         z      9  2010                                                                                                 
         x     10  2015                                                                                                 
         y     11  2015                                                                                                 
         z     12  2015   

但是,我想將其轉換為以下形式:

              2010         2015         
    Tech   Scen1 Scen2  Scen1 Scen2  
       x    ...   ...    ...   ... 
       y    ...   ...    ...   ...
       z    ...   ...    ...   ...

我使用python 3.7 for Windows 64bit和pandas版本0.23.4,非常感謝任何提示和可能的解決方案,這將有助於我解決我的問題。

有關SO的融合和支點有很多好的答案。 在樣本df中,sum列是字符串類型。 將其轉換為int並使用pivot_table。 pivot和pivot_table之間的主要區別在於,當索引包含重復條目時,您需要使用pivot_table和一些聚合函數。 如果您未傳遞任何功能,則默認為平均值。

df['Sum'] = df['Sum'].astype(int)
df.pivot_table(index = 'Tech', columns = ['Year', 'Scenario'], values = 'Sum')



Year        2010            2015
Scenario    Scen1   Scen2   Scen1   Scen2
Tech                
x           1       7       4       10
y           2       8       5       11
z           3       9       6       12

注意:使用groupby可以完成相同的操作。 由於您需要兩個級別的列,因此需要取消堆棧兩次。

df.groupby(['Tech','Scenario','Year'])['Sum'].mean().unstack().unstack()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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