我一直在阅读pd.stack
,pd.unstack
和pd.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
放在那里
答案 0 :(得分:3)
在列中将MultiIndex
与DataFrame.set_index
和DataFrame.unstack
一起使用DataFrame.sort_index
和Enumeration,然后用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