2017-01-08 2 views
6

У меня есть Pandas DataFrame, который выглядит следующим образом (df_olymic). Я хотел бы значение столбца Type должны быть преобразованы в независимых столбцах (df_olympic_table)Pandas: значения столбца преобразования в независимых столбцах

Оригинал dataframe

In [3]: df_olympic 
Out[3]: 
    Country Type Num 
0  USA Gold 46 
1  USA Silver 37 
2  USA Bronze 38 
3  GB Gold 27 
4  GB Silver 23 
5  GB Bronze 17 
6 China Gold 26 
7 China Silver 18 
8 China Bronze 26 
9 Russia Gold 19 
10 Russia Silver 18 
11 Russia Bronze 19 

Преобразованного dataframe

In [5]: df_olympic_table 
Out[5]: 
    Country N_Gold N_Silver N_Bronze 
0  USA  46  37  38 
1  GB  27  23  17 
2 China  26  18  26 
3 Russia  19  18  19 

Что бы наиболее удобным способ для достижения этой цели ?

+1

Возможный дубликат [Python панд: Преобразование строки в качестве заголовков столбцов] (HTTP : //stackoverflow.com/questions/17298313/python-pandas-convert-rows-as-column-headers) – Aprillion

+0

Извините, я могу злоупотреблять обычной терминологией pandas. Все еще продолжайте учиться :-) – TruLa

+1

@Aprillion - 'pivot_table' не требуется, если не дубликаты лучше' pivot'. – jezrael

ответ

4

Вы можете использовать DataFrame.pivot:

df = df.pivot(index='Country', columns='Type', values='Num') 
print (df) 
Type  Bronze Gold Silver 
Country      
China  26 26  18 
GB   17 27  23 
Russia  19 19  18 
USA   38 46  37 

Другое решение с DataFrame.set_index и Series.unstack:

df = df.set_index(['Country','Type'])['Num'].unstack() 
print (df) 
Type  Bronze Gold Silver 
Country      
China  26 26  18 
GB   17 27  23 
Russia  19 19  18 
USA   38 46  37 

но если получите:

ValueError: Index contains duplicate entries, cannot reshape

необходимость pivot_table с некоторой aggreagte функции по умолчанию это np.mean, но вы можете использовать sum, first ...

#add new row with duplicates value in 'Country' and 'Type' 
print (df) 
    Country Type Num 
0  USA Gold 46 
1  USA Silver 37 
2  USA Bronze 38 
3  GB Gold 27 
4  GB Silver 23 
5  GB Bronze 17 
6 China Gold 26 
7 China Silver 18 
8 China Bronze 26 
9 Russia Gold 19 
10 Russia Silver 18 
11 Russia Bronze 20 < - changed value to 20 
11 Russia Bronze 100 < - add new row with duplicates 


df = df.pivot_table(index='Country', columns='Type', values='Num', aggfunc=np.mean) 
print (df) 
Type  Bronze Gold Silver 
Country      
China  26 26  18 
GB   17 27  23 
Russia  60 19  18 < - Russia get ((100 + 20)/ 2 = 60 
USA   38 46  37 

Или groupby с aggreagting mean и перекроить по unstack:

df = df.groupby(['Country','Type'])['Num'].mean().unstack() 
print (df) 
Type  Bronze Gold Silver 
Country      
China  26 26  18 
GB   17 27  23 
Russia  60 19  18 < - Russia get ((100 + 20)/ 2 = 60 
USA   38 46  37 
+0

Отлично! Ты действительно заставил меня узнать что-то новое. Большое спасибо. – TruLa

+0

Да, это сложнее, если дублирует. Спасибо, что согласились! – jezrael

+1

@ ade1e - да, я изменил данные для добавления дубликатов, поэтому добавляю уведомление об измененных строках. – jezrael

Смежные вопросы