Объедините столбцы вместе с pivot
:
df['new'] = df['col1'] + df['col2']
df1 = df.pivot('Category','new','value')
print (df1)
new aa ab ba bb
Category
A 1 2 3 4
B 5 6 7 8
Или DataFrame.set_index
с Series.unstack
:
df1 = df.set_index(['Category',df['col1'] + df['col2']])['value'].unstack()
print (df1)
aa ab ba bb
Category
A 1 2 3 4
B 5 6 7 8
Последний, если необходимо столбец из индекса:
df1 = df1.rename_axis(None, axis=1).reset_index()
print (df1)
Category aa ab ba bb
0 A 1 2 3 4
1 B 5 6 7 8
Если возможна ошибка:
ValueError: Индекс содержит повторяющиеся записи, не может изменить форму
print (df)
Category col1 col2 value
0 A a a 1
1 A a a 4
2 A a b 2
3 A b a 3
4 A b b 4
5 B a a 5
6 B a b 6
7 B b a 7
8 B b b 8
Затем необходимо DataFrame.pivot_table
с функцией агрегирования, например, по умолчанию mean
:
df['new'] = df['col1'] + df['col2']
df = df.pivot_table(index='Category',columns='new',values='value', aggfunc='mean')
print (df)
new aa ab ba bb
Category
A 2.5 2.0 3.0 4.0
B 5.0 6.0 7.0 8.0