python - 合并具有多个键且一个键为列名的 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 数据。但想法应该是一样的。
解决方案
我已经分别命名了这些 DataFramea
和b
。我还在有空格的列名称中添加了下划线。
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
然后,您可以执行与此相同的合并。
推荐阅读
- heron - Heron 0.17.5版本如何配置heron-core文件?
- reactjs - React Js 组件或同时显示 html 和 emoj 的方式
- sql-server - 数据库基数和效率
- c# - 检查 HttpClient 是否有连接
- antd - 带有开关组件的 antd 表
- javascript - Sublime text 3 格式/将单行转换为多行
- php - 在文本 PHP Wordpress 中查找特定链接
- amazon-web-services - AWS lambda 顺序执行
- html - 获取ts文件中的视频元素
- jenkins-plugins - 如何在 Jenkins Bulk Builder 插件中使用参数?