将多索引/多级数据框简化为单索引,单级

时间:2018-08-16 00:20:44

标签: python pandas dataframe

说我有一个看起来像这样的数据框:

>>> df
   Year   MPG VehicleType FuelType
0  2000  20.5         Car      Gas
1  2009  22.3         Car      Gas
2  2017  50.9         Car      Gas
3  2000  14.7         Car   Diesel
4  2009  18.0         Car   Diesel
5  2017  22.2         Car   Diesel

我需要使用VehicleType列作为索引,根据FuelType列的值将Year列分为两列。我使用pivot_table正确地拆分了列。

>>> pd.pivot_table(df, columns=['VehicleType', 'FuelType'], values='MPG', index=['Year'])
VehicleType    Car      
FuelType    Diesel   Gas
Year                    
2000          14.7  20.5
2009          18.0  22.3
2017          22.2  50.9

这很不错,但它会产生一个多索引的数据框,出于我的目的,这是我不想要的。

我正在尝试获得看起来像这样的结果:

Year Car_Diesel_MPG Car_Gas_MPG
2000           14.7        20.5
2009           18.0        22.3
2017           22.2        50.9

我为实现这一目标所做的努力导致了一些看上去很讨厌的代码。有没有简单的方法可以做到这一点?

4 个答案:

答案 0 :(得分:5)

您可以使用+连接多索引的级别,并将其用作数据透视表的列:

# Same as your original privot table:
df2 = pd.pivot_table(df, columns=['VehicleType', 'FuelType'], values='MPG', index=['Year'])

df2.columns = df2.columns.get_level_values(0)+'_'+df2.columns.get_level_values(1)+'_MPG'

>>> df2
      Car_Diesel_MPG  Car_Gas_MPG
Year                             
2000            14.7         20.5
2009            18.0         22.3
2017            22.2         50.9

答案 1 :(得分:5)

使用set_axismapjoin

df2.set_axis(df2.columns.map('_'.join), axis=1, inplace=False).add_suffix('_MPG')

      Car_Diesel_MPG  Car_Gas_MPG
Year                             
2000            14.7         20.5
2009            18.0         22.3
2017            22.2         50.9

groupbydict

m = {t: '_'.join(t) for t in df2.columns}
df2.groupby(m, axis=1).mean().add_suffix('_MPG')

      Car_Diesel_MPG  Car_Gas_MPG
Year                             
2000            14.7         20.5
2009            18.0         22.3
2017            22.2         50.9

这些都可以reset_index

m = {t: '_'.join(t) for t in df2.columns}
df2.groupby(m, axis=1).mean().add_suffix('_MPG').reset_index()

   Year  Car_Diesel_MPG  Car_Gas_MPG
0  2000            14.7         20.5
1  2009            18.0         22.3
2  2017            22.2         50.9

groupby而不是pivot_table

df.groupby(
    ['Year', df.VehicleType.str.cat(df.FuelType, sep='_').add('_MPG').values]
).MPG.sum().unstack().reset_index()

   Year  Car_Diesel_MPG  Car_Gas_MPG
0  2000            14.7         20.5
1  2009            18.0         22.3
2  2017            22.2         50.9

答案 2 :(得分:3)

使用str.join

s=pd.pivot_table(df, columns=['VehicleType', 'FuelType'], values='MPG', index=['Year'])
pd.Index(s.columns).str.join('_')+'_MPG'
Out[9]: Index(['Car_Diesel_MPG', 'Car_Gas_MPG'], dtype='object')
s.columns = pd.Index(s.columns).str.join('_')+'_MPG'
s
Out[11]: 
      Car_Diesel_MPG  Car_Gas_MPG
Year                             
2000            14.7         20.5
2009            18.0         22.3
2017            22.2         50.9

assign列,然后再进行pivot

pd.pivot_table(df.assign(Newcol=df['VehicleType'] + '_'+df['FuelType']+'_MPG'), columns=['Newcol'], values='MPG', index=['Year'])
Out[12]: 
Newcol  Car_Diesel_MPG  Car_Gas_MPG
Year                               
2000              14.7         20.5
2009              18.0         22.3
2017              22.2         50.9

答案 3 :(得分:2)

我们称您为数据透视表df1

df1 = pd.pivot_table(df, columns=['VehicleType', 'FuelType'], values='MPG', index=['Year'])

删除级别:

df1.columns = df1.columns.droplevel()
df1

FuelType  Diesel   Gas
Year                  
2000        14.7  20.5
2009        18.0  22.3
2017        22.2  50.9

现在摆脱FuelType标签

df1.columns.name = None
df
     Diesel   Gas
Year              
2000    14.7  20.5
2009    18.0  22.3
2017    22.2  50.9