展平/删除分层列标题

时间:2015-11-17 19:44:30

标签: python pandas

我有以下数据帧,这是执行groupby +聚合总和的结果:

df.groupby(['id', 'category']).agg([pd.Series.sum])

                   supply           stock            
                      sum             sum
id     category                                                               
4      abc            161          -0.094
6      sde            -76           0.150
23     hgv             64          -0.054
1      wcd            -14           0.073 
76     jhf             -8          -0.057

由于groupby和agg,列标题现在是元组。如何将列标题更改回单个值,即:列标题必须为supplystock。我只需要从标题中删除sum

2 个答案:

答案 0 :(得分:2)

如果使用sum,则不会将“agg function name”创建为列的一部分(作为MultiIndex):

df.groupby(['id', 'category']).sum()

要删除它们,您可以删除级别:

df.columns = df.columns.droplevel(1)

例如:

In [11]: df
Out[11]:
     supply     stock
        sum       sum
0  0.501176  0.482497
1  0.442689  0.008664
2  0.885112  0.512066
3  0.724619  0.418720

In [12]: df.columns.droplevel(1)
Out[12]: Index(['supply', 'stock'], dtype='object')

In [13]: df.columns = df.columns.droplevel(1)

In [14]: df
Out[14]:
     supply     stock
0  0.501176  0.482497
1  0.442689  0.008664
2  0.885112  0.512066
3  0.724619  0.418720

答案 1 :(得分:1)

您可以将columns属性显式设置为您想要的任何属性。例如:

>>> df = pd.DataFrame(np.random.random((4, 2)),
...                  columns=pd.MultiIndex.from_arrays([['supply', 'stock'],
                                                        ['sum', 'sum']]))
>>> df
     supply     stock
        sum       sum
0  0.170950  0.314759
1  0.632121  0.147884
2  0.955682  0.127857
3  0.776764  0.318614

>>> df.columns = df.columns.get_level_values(0)
>>> df
     supply     stock
0  0.170950  0.314759
1  0.632121  0.147884
2  0.955682  0.127857
3  0.776764  0.318614