说我有一个看起来像这样的数据框:
>>> 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
我为实现这一目标所做的努力导致了一些看上去很讨厌的代码。有没有简单的方法可以做到这一点?
答案 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_axis
,map
和join
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
groupby
和dict
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