我有一个给定的数据框:
df = {'TYPE' : pd.Series(['Advisory','Advisory1','Advisory2','Advisory3']),
'CNTRY' : pd.Series(['IND','FRN','IND','FRN']),
'VALUE' : pd.Series([1., 2., 3., 4.])}
df = pd.DataFrame(df)
df = pd.pivot_table(df,index=["CNTRY"],columns=["TYPE"]).reset_index()
旋转后,如何获得具有列和
df
的数据框,如下所示;删除多级索引,VALUE
Type|CNTRY|Advisory|Advisory1|Advisory2|Advisory3
0 FRN NaN 2.0 NaN 4.0
1 IND 1.0 NaN 3.0 NaN
您可以添加参数
values
:
df = pd.pivot_table(df,index="CNTRY",columns="TYPE", values='VALUE').reset_index()
print (df)
TYPE CNTRY Advisory Advisory1 Advisory2 Advisory3
0 FRN NaN 2.0 NaN 4.0
1 IND 1.0 NaN 3.0 NaN
rename_axis
:
df = pd.pivot_table(df,index="CNTRY",columns="TYPE", values='VALUE') \
.reset_index().rename_axis(None, axis=1)
print (df)
CNTRY Advisory Advisory1 Advisory2 Advisory3
0 FRN NaN 2.0 NaN 4.0
1 IND 1.0 NaN 3.0 NaN
但也许只是必要的
pivot
:
df = df.pivot(index="CNTRY",columns="TYPE", values='VALUE') \
.reset_index().rename_axis(None, axis=1)
print (df)
CNTRY Advisory Advisory1 Advisory2 Advisory3
0 FRN NaN 2.0 NaN 4.0
1 IND 1.0 NaN 3.0 NaN
pivot_table
默认聚合函数会重复 mean
:
df = {'TYPE' : pd.Series(['Advisory','Advisory1','Advisory2','Advisory1']),
'CNTRY' : pd.Series(['IND','FRN','IND','FRN']),
'VALUE' : pd.Series([1., 4., 3., 4.])}
df = pd.DataFrame(df)
print (df)
CNTRY TYPE VALUE
0 IND Advisory 1.0
1 FRN Advisory1 1.0 <-same FRN and Advisory1
2 IND Advisory2 3.0
3 FRN Advisory1 4.0 <-same FRN and Advisory1
df = df.pivot_table(index="CNTRY",columns="TYPE", values='VALUE')
.reset_index().rename_axis(None, axis=1)
print (df)
TYPE Advisory Advisory1 Advisory2
CNTRY
FRN 0.0 2.5 0.0
IND 1.0 0.0 3.0
替代
groupby
、聚合函数和 unstack
:
df = df.groupby(["CNTRY","TYPE"])['VALUE'].mean().unstack(fill_value=0)
.reset_index().rename_axis(None, axis=1)
print (df)
CNTRY Advisory Advisory1 Advisory2
0 FRN 0.0 2.5 0.0
1 IND 1.0 0.0 3.0
您可以将
set_index
与 unstack
一起使用
df.set_index(['CNTRY', 'TYPE']).VALUE.unstack().reset_index()
TYPE CNTRY Advisory Advisory1 Advisory2 Advisory3
0 FRN NaN 2.0 NaN 4.0
1 IND 1.0 NaN 3.0 NaN
df.columns = df.columns.droplevel(level=1)
根据您的要求更改级别。