我有一个这样的DataFrame:
df_dict = dict(
key1 = [a,a,b,a,a,b,b,a,a,b,b],
key2 = [A,B,B,A,B,A,B,A,B,A,B],
level = [leve1,leve1,leve1,leve2,leve2,leve2,leve2,level3,level3,level3,level3],
var1 = [1,8,20,4,10,16,22,6,12,18,24]
var2 = [2,9,21,5,11,17,23,7,13,19,25]
)
df = pd.DataFrame(df_dict)
我想透视表以使每个级别都有var的列。我期望的输出看起来像这样:
key 1 | key 2 | leve1_var1 | leve1_var2 | leve2_var1 | leve2_var2 | level3_var1 | level3_var2 |
______________________________________________________________________________________________|
a | A | 1 | 2 | 4 | 5 | 6 | 7 |
a | B | 8 | 9 | 10 | 11 | 12 | 13 |
b | A | 0 | 0 | 16 | 17 | 18 | 19 |
b | B | 20 | 21 | 22 | 23 | 24 | 25 |
我尝试过
df.pivot_table(index=['key1','key2'],columns='level')
但是它首先为我提供了变量,并且为每个变量提供了级别,我希望将同一级别的所有变量放在一起。另外,我还不能解决合并级别+'_'+变量的标签的问题。请注意,在输出中零填充了不存在的组合。
答案 0 :(得分:1)
您只需要多一点处理即可。
df1 = df.pivot_table(index=['key1','key2'],columns='level', fill_value=0)
df1.columns = df1.columns.map('{0[1]}_{0[0]}'.format)
df1 = df1.sort_index(1).reset_index()
Out[41]:
key1 key2 leve1_var1 leve1_var2 leve2_var1 leve2_var2 level3_var1 level3_var2
0 a A 1 2 4 5 6 7
1 a B 8 9 10 11 12 13
2 b A 0 0 16 17 18 19
3 b B 20 21 22 23 24 25
答案 1 :(得分:0)
这是另一种方式:
df2 = df.set_index(['key1','key2','level']).unstack().fillna(0)
new_columns = df2.columns.get_level_values(1) + '_' + df2.columns.get_level_values(0)
df2 = df2.droplevel(0,axis=1)
df2.columns = new_columns
df2 = df2.reset_index()