Python pandas如何执行这种枢轴操作?

时间:2018-10-20 20:12:23

标签: python pandas dataframe pandas-groupby

例如,假设我有一个数据框(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       |

2 个答案:

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