在单个 Pandas 数据帧中将较低级别的列合并到较高级别



我有以下熊猫数据帧

Crop     Spring wheat       Winter wheat              
    Climate   Subtropical  Humid continental   Temperate  
    Year                                                  
    1981       354.666667         258.666667  159.666667  
    1982       280.000000         313.333333  157.333333  
    1983       386.666667         313.000000  122.333333  
    1984       336.333333         253.333333  196.333333  
    1985       329.000000         173.666667  126.333333  
    1986       299.666667         326.333333  188.666667  
    1987       264.666667         248.333333  123.666667  
    1988       246.666667         257.333333  113.666667  
    1989       204.666667         329.666667  211.000000  
    1990       185.333333         349.666667  152.333333  
    1991       276.666667         329.000000  158.000000  
    1992       260.333333         303.666667  150.333333  
    1993       271.000000         278.000000  208.000000  
    1994       356.333333         393.666667  174.333333  
    1995       397.666667         318.333333  110.666667  
    1996       151.666667         312.666667  327.333333  
    1997       212.666667         350.666667  143.000000  
    1998       197.000000         152.666667  118.666667

我想将所有小麦品种(即春季和冬季)合并为一个称为小麦的 0 级。 结果应该是:

Crop     Wheat
Climate  Humid continental   Temperate  Subtropical
Year                                               
1981            258.666667  159.666667   354.666667
1982            313.333333  157.333333   280.000000
1983            313.000000  122.333333   386.666667
1984            253.333333  196.333333   336.333333
1985            173.666667  126.333333   329.000000
1986            326.333333  188.666667   299.666667
1987            248.333333  123.666667   264.666667
1988            257.333333  113.666667   246.666667
1989            329.666667  211.000000   204.666667
1990            349.666667  152.333333   185.333333
1991            329.000000  158.000000   276.666667
1992            303.666667  150.333333   260.333333
1993            278.000000  208.000000   271.000000
1994            393.666667  174.333333   356.333333
1995            318.333333  110.666667   397.666667
1996            312.666667  327.333333   151.666667
1997            350.666667  143.000000   212.666667
1998            152.666667  118.666667   197.000000

通过在数据帧中创建一个新的 0 级(小麦)并使用 1 级列(春小麦、冬小麦)中的数据填充它,我设法实现了预期的结果:

df['Wheat', 'Humid continental'] = df['Winter wheat']['Humid continental']
df['Wheat', 'Temperate'] = df['Winter wheat']['Temperate']
df['Wheat', 'Subtropical'] = df['Spring wheat']['Subtropical'] 

虽然这完全是我想要的,但我相信熊猫有更聪明、更有效的方式来做到这一点。

你能帮我这个吗?

这感觉有点像一个黑客,但你可以在这里使用set_levels

In [11]: df1.columns.set_levels(['Wheat', 'Wheat'], 'Crop')
Out[11]:
MultiIndex(levels=[[u'Wheat', u'Wheat'], [u'Humid continental', u'Subtropical', u'Temperate']],
           labels=[[0, 1, 1], [1, 0, 2]],
           names=[u'Crop', u'Climate'])
In [12]: df1.columns = df1.columns.set_levels(['Wheat', 'Wheat'], 'Crop')
In [13]: df1
Out[13]:
Crop          Wheat
Climate Subtropical Humid continental   Temperate
Year
1981     354.666667        258.666667  159.666667
1982     280.000000        313.333333  157.333333
1983     386.666667        313.000000  122.333333
1984     336.333333        253.333333  196.333333
1985     329.000000        173.666667  126.333333
1986     299.666667        326.333333  188.666667
1987     264.666667        248.333333  123.666667
1988     246.666667        257.333333  113.666667
1989     204.666667        329.666667  211.000000
1990     185.333333        349.666667  152.333333
1991     276.666667        329.000000  158.000000
1992     260.333333        303.666667  150.333333
1993     271.000000        278.000000  208.000000
1994     356.333333        393.666667  174.333333
1995     397.666667        318.333333  110.666667
1996     151.666667        312.666667  327.333333
1997     212.666667        350.666667  143.000000
1998     197.000000        152.666667  118.666667

请参阅在文档中设置元数据。

最新更新