Используйте set_index
с объединенными столбцами и unstack
для изменения формы:
df = df.set_index(['id', df['tp'] + df['dt'].astype(str)])['amt'].unstack().reset_index()
print (df)
id CR2017 CR2018 DR2017 DR2018
0 1 94678.0 13508.0 78671.0 13797.0
1 2 111417.0 21479.0 95266.0 1864.0
Или создайте новый столбец:
df['new'] = df['tp'] + df['dt'].astype(str)
df = df.set_index(['id', 'new'])['amt'].unstack().rename_axis(None, axis=1).reset_index()
print (df)
id CR2017 CR2018 DR2017 DR2018
0 1 94678.0 13508.0 78671.0 13797.0
1 2 111417.0 21479.0 95266.0 1864.0
Но если получить:
ValueError: Индекс содержит повторяющиеся записи, не может изменить форму
, это означает, что есть дублированные id
с парами соединений, такими как:
print (df)
id tp dt amt
0 1 CR 2017 94678.0 <-dupe 1 CR 2017
0 1 CR 2017 10000.0 <-dupe 1 CR 2017
1 1 CR 2018 13508.0
2 1 DR 2017 78671.0
3 1 DR 2018 13797.0
4 2 CR 2017 111417.0
5 2 CR 2018 21479.0
6 2 DR 2017 95266.0
7 2 DR 2018 1864.0
растворы агрегируют - с помощью groupby
+ функции агрегирования, например mean
, sum
и unstack
:
df = df.groupby(['id', df['tp'] + df['dt'].astype(str)])['amt'].mean().unstack().reset_index()
Или pivot_table
по умолчанию aggfunc='mean'
:
df = df.pivot_table(index='id',columns=df['tp'] + df['dt'].astype(str), values= 'amt').reset_index()