python - Pandas:转换独立列中的列值

标签 python pandas

我有如下所示的 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

实现此目标最方便的方法是什么?

最佳答案

您可以使用 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: Index contains duplicate entries, cannot reshape

需要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 reshape :

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

关于python - Pandas:转换独立列中的列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41531689/

相关文章:

python - 使用 Pandas/python 根据多个条件选择数据

python 2 从urllib2响应结果中获取汉字之间的数字

python - 如何重载 Python 的 __bool__ 方法?

python - 如何在 Pandas df/series 上使用 .groupby() 后预览行

python - 使用 matplotlib 子图绘制 pandas groupby 输出

python - 扭曲关闭事件未触发

python - 如何创建一个空的 pandas DataFrame,并为每列分配不同的数据类型?

Python 多索引 : Finding cordinates with level 2 index, DataFrame

regex - 替换 Pandas 出生日期的前几位

python - 在Python中使用可变线型绘制一条线