熊猫PIVOT数据框并按级别组合列名称

时间:2020-10-10 02:44:07

标签: python-3.x pandas dataframe pivot

我有一个这样的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')

但是它首先为我提供了变量,并且为每个变量提供了级别,我希望将同一级别的所有变量放在一起。另外,我还不能解决合并级别+'_'+变量的标签的问题。请注意,在输出中零填充了不存在的组合。

2 个答案:

答案 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()