如何匹配双边数据集的国家名并关联v2x_regime完成合并?
合并双边数据集与单国属性数据
问题描述
需要将包含单国年度属性的df1,与包含双边关系的df2合并,把df1中的v2x_regime字段分别关联到df2的报告国和伙伴国,最终生成包含报告国、报告国的v2x_regime、伙伴国、伙伴国的v2x_regime及年份的数据集。
原始数据
df1(单国年度属性)
| country_name(国家名称) | Year(年份) | v2x_regime |
|---|---|---|
| 土耳其(Turkiye) | 1993 | 0 |
| 土耳其(Turkiye) | 1994 | 0 |
| 土耳其(Turkiye) | 1995 | 1 |
| 意大利 | 1993 | 1 |
| 西班牙 | 1993 | 0 |
| 德国 | 1993 | 1 |
| 俄罗斯 | 1993 | 0 |
| 俄罗斯 | 1995 | 0 |
| 美国(USA) | 1993 | 1 |
df2(双边关系数据)
| Reporting Country(报告国) | Partner Country(伙伴国) | Year(年份) | FDI_outward |
|---|---|---|---|
| 土耳其(Turkiye) | 意大利 | 1993 | 132 |
| 土耳其(Turkiye) | 意大利 | 1994 | 392 |
| 意大利 | 土耳其(Turkiye) | 1993 | 913 |
| 乌克兰(Ukrain) | 德国 | 1993 | 512 |
| 德国 | 俄罗斯 | 1993 | 714 |
| 俄罗斯 | 德国 | 1993 | 451 |
| 俄罗斯 | 德国 | 1995 | 282 |
| 美国(USA) | 英国(UK) | 1993 | 1241 |
解决方案(Python Pandas)
核心思路是两次左连接:先将df2与df1按「报告国+年份」匹配,得到报告国的v2x_regime;再将结果与df1按「伙伴国+年份」匹配,得到伙伴国的v2x_regime。
代码实现
import pandas as pd # 构造df1数据 df1 = pd.DataFrame({ 'country_name': ['土耳其(Turkiye)', '土耳其(Turkiye)', '土耳其(Turkiye)', '意大利', '西班牙', '德国', '俄罗斯', '俄罗斯', '美国(USA)'], 'Year': [1993, 1994, 1995, 1993, 1993, 1993, 1993, 1995, 1993], 'v2x_regime': [0, 0, 1, 1, 0, 1, 0, 0, 1] }) # 构造df2数据 df2 = pd.DataFrame({ 'Reporting Country(报告国)': ['土耳其(Turkiye)', '土耳其(Turkiye)', '意大利', '乌克兰(Ukrain)', '德国', '俄罗斯', '俄罗斯', '美国(USA)'], 'Partner Country(伙伴国)': ['意大利', '意大利', '土耳其(Turkiye)', '德国', '俄罗斯', '德国', '德国', '英国(UK)'], 'Year': [1993, 1994, 1993, 1993, 1993, 1993, 1995, 1993], 'FDI_outward': [132, 392, 913, 512, 714, 451, 282, 1241] }) # 第一次合并:匹配报告国的v2x_regime merged = pd.merge(df2, df1, left_on=['Reporting Country(报告国)', 'Year'], right_on=['country_name', 'Year'], how='left').rename(columns={'v2x_regime': 'v2x_regime_reporting'}) # 第二次合并:匹配伙伴国的v2x_regime final_df = pd.merge(merged, df1, left_on=['Partner Country(伙伴国)', 'Year'], right_on=['country_name', 'Year'], how='left').rename(columns={'v2x_regime': 'v2x_regime_partner'}) # 筛选需要的列并整理顺序 final_df = final_df[[ 'Reporting Country(报告国)', 'v2x_regime_reporting', 'Partner Country(伙伴国)', 'v2x_regime_partner', 'Year', 'FDI_outward' ]] # 查看结果 print(final_df)
最终输出结果
| Reporting Country(报告国) | v2x_regime_reporting | Partner Country(伙伴国) | v2x_regime_partner | Year | FDI_outward |
|---|---|---|---|---|---|
| 土耳其(Turkiye) | 0.0 | 意大利 | 1.0 | 1993 | 132 |
| 土耳其(Turkiye) | 0.0 | 意大利 | NaN | 1994 | 392 |
| 意大利 | 1.0 | 土耳其(Turkiye) | 0.0 | 1993 | 913 |
| 乌克兰(Ukrain) | NaN | 德国 | 1.0 | 1993 | 512 |
| 德国 | 1.0 | 俄罗斯 | 0.0 | 1993 | 714 |
| 俄罗斯 | 0.0 | 德国 | 1.0 | 1993 | 451 |
| 俄罗斯 | 0.0 | 德国 | NaN | 1995 | 282 |
| 美国(USA) | 1.0 | 英国(UK) | NaN | 1993 | 1241 |
说明
- 结果中的
NaN表示对应国家-年份组合在df1中没有数据(比如1994年的意大利、1995年的德国、乌克兰、英国),可根据需求用fillna()填充默认值(如final_df.fillna(0, inplace=True))。 - 确保国家名称的格式完全一致(比如「美国(USA)」和「美国(US)」会被视为不同国家),若存在名称不一致的情况,需先统一国家名称格式。
内容的提问来源于stack exchange,提问作者user19562955
相关产品推荐
相关产品推荐

