【问题标题】:merge DataFrames with multiple keys and one key being column name合并具有多个键且一个键为列名的 DataFrame
【发布时间】:2021-08-22 03:01:10
【问题描述】:

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

我有以下数据框:

DF:-

    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

合并后所需的Dataframe是:-

    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 数据。但想法应该是一样的。

【问题讨论】:

  • 你是怎么得到两个相同的列1996的?
  • 这是一个错误我会编辑它
  • Google for melt 函数
  • 在 GDP 数据数据框中,您有 2 行 China 作为 Country Name,Year 作为 2004,应该选择哪一个?此问题有很多灰色区域,请查看并编辑您的问题
  • 在这两个条目中,一个是中国 1996 年的 GDP,另一个是 2004 年

标签: python pandas


【解决方案1】:

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

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

然后您可以对这个执行相同的合并。

【讨论】:

  • 我太慢了,该死的手机;)+1
  • 哇,这正是我想要的。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 2015-11-23
  • 1970-01-01
  • 2013-05-04
  • 2017-09-02
  • 1970-01-01
相关资源
最近更新 更多