我有一个通常看起来像这样的数据框:
df = pd.DataFrame({'Country': ['USA', 'USA', 'Canada', 'Canada'], 'GDP': [45000, 68000, 34000, 46000], 'Education': [5, 3, 7, 9]})
给予:
Country Education GDP
0 USA 5 45000
1 USA 3 68000
2 Canada 7 34000
3 Canada 9 46000
我希望每个国家/地区的所有值都列在同一行,所以它显示为:
Country Education Education GDP GDP
USA 5 3 45000 68000
如何实现这一目标?
是的,有些列的名称相同。
谢谢。
答案 0 :(得分:1)
原始DataFrame:
In [150]: df
Out[150]:
Country Education GDP
0 USA 5 45000
1 USA 3 68000
2 Canada 7 34000
3 Canada 9 46000
鉴于each country对于同一属性只有两个值:
In [151]: df1 = df.groupby('Country').nth(0).reset_index()
In [152]: df1
Out[152]:
Country Education GDP
0 Canada 7 34000
1 USA 5 45000
In [153]: df2 = df.groupby('Country').nth(1).reset_index()
In [154]: df2
Out[154]:
Country Education GDP
0 Canada 9 46000
1 USA 3 68000
In [155]: pd.concat([df1, df2.drop('Country', 1)], axis=1)
Out[155]:
Country Education GDP Education GDP
0 Canada 7 34000 9 46000
1 USA 5 45000 3 68000
如果需要,重新排列列:
In [165]: df3 = pd.concat([df1, df2.drop('Country', 1)], axis=1)
In [166]: df3 = df3[['Country', 'Education', 'GDP']]
In [167]: df3
Out[167]:
Country Education Education GDP GDP
0 Canada 7 9 34000 46000
1 USA 5 3 45000 68000
答案 1 :(得分:1)
您想要的输出通常会导致信息丢失。
Country Education Education GDP GDP
USA 5 3 45000 68000
在上述情况下,您需要跟踪哪个GDP列对应哪个教育列。
如果您不坚持将其保留在此表单中,则可以形成数据透视表:
df2=df.pivot(index='Country',columns='Education',values='GDP').reset_index()
这使得教育的每个唯一值成为一列,该列的值将是相应的GDP值。
Education Country 3 5 7 9
0 Canada NaN NaN 34000.0 46000.0
1 USA 68000.0 45000.0 NaN NaN
可以通过以下方式获得更好看的输出:
df2=df.pivot(index='Country',columns='Education',values='GDP').reset_index().set_index('Country')
产生
Country 3 5 7 9
Canada 34000.0 46000.0
USA 68000.0 45000.0