熊猫:将列打包成行

时间:2019-03-12 09:00:06

标签: python pandas

我一直在阅读pd.stackpd.unstackpd.pivot,但我无法全神贯注地完成自己想做的事情

给出如下数据框

   id1 id2  id3  vals  vals1
0    1   a   -1    10     20
1    1   a   -2    11     21
2    1   a   -3    12     22
3    1   a   -4    13     23
4    1   b   -1    14     24
5    1   b   -2    15     25
6    1   b   -3    16     26
7    1   b   -4    17     27

我想得到以下结果

   id1 id2  -1_vals  -2_vals  ...  -1_vals1  -2_vals1  -3_vals1  -4_vals1
0    1   a       10       11  ...        20        21        22        23
1    1   b       14       15  ...        24        25        26        27

这是一种带有枢轴的groupby,列id3被散布到行中,其中新列名是原始列和值id3的对应串联

编辑:可以保证每个id1 + id2 id3是唯一的,但是id1 + id2的某些组将具有不同的{{ 1}}-在这种情况下,可以将id3放在那里

1 个答案:

答案 0 :(得分:3)

在列中将MultiIndexDataFrame.set_indexDataFrame.unstack一起使用DataFrame.sort_indexEnumeration,然后用f-string s的列表理解对其进行展平:

df1 = (df.set_index(['id1','id2','id3'])
         .unstack()
         .sort_index(level=[0,1], ascending=[True, False], axis=1))

#python 3.6+
df1.columns = [f'{b}_{a}' for a, b in df1.columns]
#python below
#df1.columns = ['{}_{}'.format(a, b) for a, b in df1.columns]
df1 = df1.reset_index()
print (df1)
   id1 id2  -1_vals  -2_vals  -3_vals  -4_vals  -1_vals1  -2_vals1  -3_vals1  \
0    1   a       10       11       12       13        20        21        22   
1    1   b       14       15       16       17        24        25        26   

   -4_vals1  
0        23  
1        27