Pandas:将列的值转换为独立的列

11

我有一个 Pandas DataFrame,看起来像这样 (df_olymic)。 我想将列 Type 的值转换为独立的列 (df_olympic_table)。

原始数据框

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

转换后的数据框

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
什么方法最方便实现这个?

2
可能是Python Pandas:将行转换为列标题的重复问题。 - Aprillion
抱歉,我可能会滥用pandas的常见术语。仍在不断学习中 :-) - TruLa
1
@Aprillion - 如果没有重复项,最好使用 pivot,不需要使用 pivot_table - jezrael
1个回答

12
您可以使用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_indexSeries.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:索引包含重复条目,无法重新整形

需要使用pivot_table函数进行数据透视表,并指定一个聚合函数。默认情况下,该函数为 np.mean,但您还可以使用 sumfirst等。

#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 进行聚合,使用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

太棒了!你真的让我学到了新东西。非常感谢。 - TruLa
是的,如果有重复项,情况会更加复杂。感谢您的接受! - jezrael
1
@ade1e - 是的,我为添加重复数据进行了更改,因此我在更改的行上添加了通知。 - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接