如何在Pandas中基于共享价值将多行合并为一行

时间:2016-09-16 01:29:16

标签: python pandas

我有一个通常看起来像这样的数据框:

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

如何实现这一目标?

是的,有些列的名称相同。

谢谢。

2 个答案:

答案 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

Concat来自任何一个的两个数据框和drop重复列:

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