【问题标题】:Reordering pandas dataframe data for a multiindex after pivot在枢轴之后为多索引重新排序熊猫数据帧数据
【发布时间】:2019-09-01 09:25:47
【问题描述】:

我正在为公共交通数据构建一个分析工具,并希望在 pandas 数据框中重新排序数据,这可以使用以下示例进行最佳解释:

我最初的数据形状是:

            Population                                GDP per capita
date        2015          2016          2017          2015            2016            2017
country                        
France      66593366.0    66859768.0    67118648.0    40564.460707    41357.986933    42850.386280
Germany     81686611.0    82348669.0    82695000.0    47810.836011    48943.101805    50638.890964
Italy       60730582.0    60627498.0    60551416.0    36640.115578    38380.172412    39426.940797
Spain       46444832.0    46484062.0    46572028.0    34818.120507    36305.222132    37997.852337

我不想重塑数据框,以便日期是顶级索引,而当前较低级别的信息 PopulationGDP per capita 位于较低级别。生成的数据框应如下所示:

            2015                            2016                            2017
date        Population    GDP per capita    Population    GDP per capita    Population    GDP per capita
country
France      66593366.0    40564.460707      66859768.0    41357.986933      67118648.0    42850.386280
Germany     81686611.0    47810.836011      82348669.0    48943.101805      82695000.0    50638.890964
Italy       60730582.0    36640.115578      60627498.0    38380.172412      60551416.0    39426.940797
Spain       46444832.0    34818.120507      46484062.0    36305.222132      46572028.0    37997.852337

如何使用 pandas 实现这一目标?我一直在尝试swaplevel,但无法获得预期的结果。

数据框是通过pivot操作从以下数据中获得的:

       country    date    Population    GDP per capita    GNI per capita

1      Germany    2017    82695000.0    50638.890964    51680.0
2      Germany    2016    82348669.0    48943.101805    49770.0
3      Germany    2015    81686611.0    47810.836011    48690.0
60     Spain      2017    46572028.0    37997.852337    37990.0
61     Spain      2016    46484062.0    36305.222132    36300.0
62     Spain      2015    46444832.0    34818.120507    34740.0
119    France     2017    67118648.0    42850.386280    43790.0
120    France     2016    66859768.0    41357.986933    42020.0
121    France     2015    66593366.0    40564.460707    41100.0
237    Italy      2017    60551416.0    39426.940797    39640.0
238    Italy      2016    60627498.0    38380.172412    38470.0
239    Italy      2015    60730582.0    36640.115578    36440.0

还有以下pivot

df_p = df_small.pivot(
    index='country', 
    columns='date', 
    values=['Population', 'GDP per capita'])

【问题讨论】:

    标签: python pandas dataframe pivot reshape


    【解决方案1】:

    交换级别和 sort_index,

    df_p.columns = df_p.columns.swaplevel(1,0)
    df_p = df_p.sort_index(axis = 1)
    
    
    date    2015                        2016                        2017
            GDP per capita  Population  GDP per capita  Population  GDP per capita  Population
    country                     
    France  40564.460707    66593366.0  41357.986933    66859768.0  42850.386280    67118648.0
    Germany 47810.836011    81686611.0  48943.101805    82348669.0  50638.890964    82695000.0
    Italy   36640.115578    60730582.0  38380.172412    60627498.0  39426.940797    60551416.0
    Spain   34818.120507    46444832.0  36305.222132    46484062.0  37997.852337    46572028.0
    

    【讨论】:

      【解决方案2】:

      从广义上讲,您想做这样的事情:

      df.pivot(index='country', columns='date', values=['GDP per capita' , 'Population']) \
          .reorder_levels(['date', None], axis=1) \  # the multiindex doesn't get a name, so None
          .sort_index(level=[0, 1], axis=1, ascending=[True, False])
      

      首先,您进行旋转。然后,重新排序级别以将日期放在顶部。这会产生一些不太正确的东西,MultiIndex 然后为每个元素提供一个条目。

      其次,按级别对列索引进行排序以对它们进行分组。你最终会得到这个:

      date           2015                       2016                       2017               
               Population GDP per capita  Population GDP per capita  Population GDP per capita
      country                                                                                 
      France   66593366.0   40564.460707  66859768.0   41357.986933  67118648.0   42850.386280
      Germany  81686611.0   47810.836011  82348669.0   48943.101805  82695000.0   50638.890964
      Italy    60730582.0   36640.115578  60627498.0   38380.172412  60551416.0   39426.940797
      Spain    46444832.0   34818.120507  46484062.0   36305.222132  46572028.0   37997.852337
      

      此外,最好找到一种方法来轻松读取数据,而不必使用 pd.read_csv(string_io_obj, sep='\s\s+') 来划分系统,但这只是一个小问题。

      通过为这两个级别传递显式排序指令,您还可以将level=1 设置为具有相反顺序的列,以在人均 GDP 之前获得人口。在其他情况下,这可能不起作用,因为有人可能想要明确的排序,而不是巧合的字母(或相反的字母)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-02
        • 1970-01-01
        • 2017-04-08
        • 1970-01-01
        • 2016-06-13
        • 1970-01-01
        • 2015-02-22
        • 2020-06-19
        相关资源
        最近更新 更多