首页 > 解决方案 > 合并具有多个键且一个键为列名的 DataFrame

问题描述

我有两个数据框,我想使用 2 个键合并它们,其中一个将直接是列

我有以下数据框:

东风:-

    Sex Age    Height   country    Year   Grade
0   M   31.0    188.0   Bulgaria    2016    D+
1   F   28.0    166.0   China       1996    D+
2   M   30.0    NaN     Sweden      1960    D+
3   F   28.0    181.0   China       2004    D+
4   F   16.0    175.0   Hungary     1998    D+

GDP_数据:

    Country Name    Country Code    2016       1996     1960     2004      1998
0   Bulgaria          BGR           1946      NaN       5377    5285       NaN
1   China             CHI           1186      3314      NaN     7314       3314
2   Sweden            SWE           1590      4694      2723    8532       4694
3   China             CHI           6580      NaN       NaN     5120       NaN
4   Hungary           HUN           2858      1223      NaN     2935       1223

合并后所需的数据框是:-

    Sex Age    Height   country    Year   Grade   GDP
0   M   31.0    188.0   Bulgaria    2016    D+    1946
1   F   28.0    166.0   China       1996    D+    3314
2   M   30.0    NaN     Sweden      1960    D+    2723
3   F   28.0    181.0   China       2004    D+    5120
4   F   16.0    175.0   Hungary     1998    D+    1223

由此产生的 DataFrame 应该得到国家相对于年份的 GDP。

我需要分别匹配来自 DF 和 GDP_data 的 Country Name 和 country 以及来自第一个 DataFrame 的 Year 列,但在第二个 DataFrame 中我有几年作为列。

我如何合并这两个?

这只是我在这里展示的示例数据,但实际上它是非常大的数据,大约有 20000 行和从 1960 年到 2016 年的 gdp 数据。但想法应该是一样的。

标签: pythonpandas

解决方案


我已经分别命名了这些 DataFrameab。我还在有空格的列名称中添加了下划线。

b需要融化。

>>> melted = b.melt(id_vars=('Country_Name', 'Country_Code'), var_name='year', value_name='GDP')
   Country_Name Country_Code  year     GDP
0      Bulgaria          BGR  2016  1946.0
1         China          CHI  2016  1186.0
2        Sweden          SWE  2016  1590.0
3         China          CHI  2016  6580.0
...

这种情况还在继续。然后,您可以合并两个 DataFrame。

>>> pd.merge(a, melted, left_on=('country', 'Year'), right_on=('Country_Name', 'year'))
  Sex   Age  Height   country  Year Grade Country_Name Country_Code  year     GDP
0   M  31.0   188.0  Bulgaria  2016    D+     Bulgaria          BGR  2016  1946.0
1   F  28.0   166.0     China  1996    D+        China          CHI  1996  3314.0
2   F  28.0   166.0     China  1996    D+        China          CHI  1996     NaN
3   M  30.0     NaN    Sweden  1960    D+       Sweden          SWE  1960  2723.0
4   F  28.0   181.0     China  2004    D+        China          CHI  2004  7314.0
5   F  28.0   181.0     China  2004    D+        China          CHI  2004  5120.0
6   F  16.0   175.0   Hungary  1998    D+      Hungary          HUN  1998  1223.0

可以删除多余的列。

更新:我发现有时某个国家和年份的 GDP 不止一个,因此一种可能性是只保留最高的。

>>> new_melted = melted.sort_values('GDP', ascending=False).drop_duplicates(('Country_Name', 'year'))

   Country_Name Country_Code  year     GDP
17       Sweden          SWE  2004  8532.0
16        China          CHI  2004  7314.0
3         China          CHI  2016  6580.0
10     Bulgaria          BGR  1960  5377.0
...
14      Hungary          HUN  1960     NaN
20     Bulgaria          BGR  1998     NaN

然后,您可以执行与此相同的合并。


推荐阅读