2016-05-03 2 views
2

Если у меня есть DataFrame вроде этого:Вырвавшись колонки группами в панд

type value group 
    a  10  one 
    b  45  one 
    a  224  two 
    b  119  two 
    a  33 three 
    b  44 three 

как я сделать это в этом:

type  one  two three 
    a  10  224  33 
    b  45  119  44 

Я думал, что это будет pivot_table, но просто дает мне перегруппированный список.

ответ

2

Я думаю, что вам нужно pivot с rename_axis (новый в pandas0.18.0) и reset_index:

print df.pivot(index='type', columns='group', values='value') 
     .rename_axis(None, axis=1) 
     .reset_index() 

    type one three two 
0 a 10  33 224 
1 b 45  44 119 

Если порядок столбцов важно:

df = df.pivot(index='type', columns='group', values='value').rename_axis(None, axis=1) 

print df[['one','two','three']].reset_index() 
    type one two three 
0 a 10 224  33 
1 b 45 119  44 

EDIT:

В вашей реальной данных вы можете получить ошибку:

print df.pivot(index='type', columns='group', values='value') 
     .rename_axis(None, axis=1) 
     .reset_index() 

ValueError: Index contains duplicate entries, cannot reshape

print df 
    type value group 
0 a  10 one 
1 a  20 one 
2 b  45 one 
3 a 224 two 
4 b 119 two 
5 a  33 three 
6 b  44 three 

Проблема во втором ряду - Вы получаете для значения индекса a и столбца one два значения - 10 и 20. Функция pivot_table совокупных данных в этом случае. Функция агрегации Dafault составляет np.mean, но вы можете изменить ее по параметру aggfunc:

print df.pivot_table(index='type', columns='group', values='value', aggfunc=np.mean) 
     .rename_axis(None, axis=1) 
     .reset_index() 

    type one three two 
0 a 15  33 224 
1 b 45  44 119 

print df.pivot_table(index='type', columns='group', values='value', aggfunc='first') 
     .rename_axis(None, axis=1) 
     .reset_index() 

    type one three two 
0 a 10  33 224 
1 b 45  44 119 

print df.pivot_table(index='type', columns='group', values='value', aggfunc=sum) 
     .rename_axis(None, axis=1) 
     .reset_index() 

    type one three two 
0 a 30  33 224 
1 b 45  44 119 
Смежные вопросы