Python pandas Как выполнить этот вид разворота? - PullRequest
0 голосов
/ 20 октября 2018

Например, скажем, у меня есть фрейм данных (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 голосов
/ 21 октября 2018

Вы можете 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
0 голосов
/ 20 октября 2018

Вы можете выполнить операцию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...