连接pandas数据帧。保留多索引级别

时间:2017-04-24 18:33:09

标签: python pandas multi-index

在问这里之前尝试了很多事情。感谢任何帮助。

我有两个数据框,它们是我想要合并在一起的聚合函数的产物,并且能够根据多索引级别对它们进行排序。

以下是这样的:

       Serial   year     quarter  min      median     mean          max  
0   #474331000  2014        2   2350000   2350000  2.350000e+06   2350000   
1   #484110AD1  2014        2    185000    185000  1.850000e+05    185000   
2   #484114BA0  2014        2    126000    126000  1.260000e+05    126000 

     Serial    year    quarter    min   median     mean      max          
0  #484118020  2015        1      100      100      100      100            
1  #484119AF0  2015        1   160000   165250   165250   170500     
2  #484121AG0  2015        1   120000   120000   120000   120000     

我想将它们合并在一起以获得类似的内容:

          y2014    y2014     y2014   y2015   y2015  y2015
            2q       2q       2q      1q      1q    1q
            min     median    mean   median mean    min
Serials                     
#3843442115  600     1,148   1,171   2,100   364    40
#5243420535  1,100   1,375   1,359   1,650   169    33
#0843451718  1,100   1,450   1,429   1,750   178    27
#7442431510  750     950     975     1,200   112    24
#7443431921  775     925     972     1,300   155    23
#7442431323  700     950     925     1,100   97     21

最终,我希望能够按公制,年份,季度选择结果,并绘制他们随时间变化的情况。

目前数据框上有一个简单的索引,我认为用上面标有的年份和季度标签标记每个列可能需要也可能不需要多索引。

设置索引后,我找不到合并数据帧的方法来提供所需的结果。

有人可以指出我正确的方向,以帮助我合并,查询和排序(年,季度,公制)多指数水平的数据框架?

谢谢

2 个答案:

答案 0 :(得分:0)

一种解决方案是只设置列名称,您将在上面的表单中使用它们。

result.columns=[['year']*6,['quarter']*6,['min','median','mean','max','std','count']]

稍后您可以根据这些列名进行切片。

答案 1 :(得分:0)

你走了:

基于您的数据的原始输入:

>>> df1
       Serial  year  quarter      min   median       mean      max
0  #474331000  2014        2  2350000  2350000  2350000.0  2350000
1  #484110AD1  2014        2   185000   185000   185000.0   185000
2  #484114BA0  2014        2   126000   126000   126000.0   126000
>>> df2
       Serial  year  quarter     min  median    mean     max
0  #484118020  2015        1     100     100     100     100
1  #484119AF0  2015        1  160000  165250  165250  170500
2  #484121AG0  2015        1  120000  120000  120000  120000

将它们转换为您正在寻找的多索引列

>>> df1_transformed = df1.set_index(['Serial', 'year', 'quarter']).unstack().unstack()
>>> df2_transformed = df2.set_index(['Serial', 'year', 'quarter']).unstack().unstack()
>>> df1_transformed
                min   median       mean      max
quarter           2        2          2        2
year           2014     2014       2014     2014
Serial
#474331000  2350000  2350000  2350000.0  2350000
#484110AD1   185000   185000   185000.0   185000
#484114BA0   126000   126000   126000.0   126000
>>> df2_transformed
               min  median    mean     max
quarter          1       1       1       1
year          2015    2015    2015    2015
Serial
#484118020     100     100     100     100
#484119AF0  160000  165250  165250  170500
#484121AG0  120000  120000  120000  120000

您可以使用df1_transformed.reorder_levels([2,1,0], axis=1)来获取您喜欢的列索引的顺序,但为了简单起见,我将其留下。

最后将它们结合起来:

>>> final = pd.concat([df1_transformed, df2_transformed], axis=1)
>>> final
                  min     median       mean        max       min    median  \
quarter             2          2          2          2         1         1
year             2014       2014       2014       2014      2015      2015
#474331000  2350000.0  2350000.0  2350000.0  2350000.0       NaN       NaN
#484110AD1   185000.0   185000.0   185000.0   185000.0       NaN       NaN
#484114BA0   126000.0   126000.0   126000.0   126000.0       NaN       NaN
#484118020        NaN        NaN        NaN        NaN     100.0     100.0
#484119AF0        NaN        NaN        NaN        NaN  160000.0  165250.0
#484121AG0        NaN        NaN        NaN        NaN  120000.0  120000.0

                mean       max
quarter            1         1
year            2015      2015
#474331000       NaN       NaN
#484110AD1       NaN       NaN
#484114BA0       NaN       NaN
#484118020     100.0     100.0
#484119AF0  165250.0  170500.0
#484121AG0  120000.0  120000.0

由于您的原始输入数据没有重叠的序列号,因此最终矩阵有许多NaN s。如果它们的序列号重叠,则NaN将被填充。