例如,假设我有一个数据框(id为字母):
letter|color |number
a |green |2
a |blue |3
b |red |3
b |blue |4
b |yellow|1
c |red |9
c |blue |5
我想要的是将其转换为:
letter|color_1|color_2|color_3|number_1|number_2|number_3
a |green |blue | |2 |3 |
b |red |blue |yellow |3 |4 |1
c |red |blue | |9 |5 |
答案 0 :(得分:1)
您可以执行GroupBy
+ agg
操作并创建一个新的数据框以将结果连接起来:
g = df.groupby('letter').agg(list)
df1 = pd.DataFrame(g['color'].values.tolist(), index=g.index).add_prefix('color_')
df2 = pd.DataFrame(g['number'].values.tolist(), index=g.index).add_prefix('number_')
res = pd.concat([df1, df2], axis=1).reset_index()
print(res)
letter color_0 color_1 color_2 number_0 number_1 number_2
0 a green blue None 2 3 NaN
1 b red blue yellow 3 4 1.0
2 c red blue None 9 5 NaN
答案 1 :(得分:1)
您可以在stack
之前pivot
,并进行一些数据操作:
s = df.set_index('letter').stack().reset_index(name='vals')
counter = s.groupby(['letter', 'level_1']).cumcount().add(1).astype(str)
(s.assign(flag=s.level_1 + '_' + counter)
.pivot_table(index='letter', values='vals', columns='flag', aggfunc='first'))
tmp color_1 color_2 color_3 number_1 number_2 number_3
letter
a green blue NaN 2 3 NaN
b red blue yellow 3 4 1
c red blue NaN 9 5 NaN