Python中如何将多年份DataFrame与主表外连接并新增列?
解决方案:多年度DataFrame外连接并扩展为新列
没问题!你要实现的是把多个年度的移民统计数据(总数、女性、男性)作为独立新列合并到主表,用Pandas完全可以轻松搞定,下面给你两种实用的方法:
方法一:先合并年度表再透视(推荐,更高效)
这种方法适合批量处理多个年度表,步骤清晰:
给每个年度表添加年份标识
先给每个独立的年度DataFrame加一个year列,用来区分不同年份的数据:# 假设你的年度表分别是df_2000、df_2001...df_2008 df_2000['year'] = 2000 df_2001['year'] = 2001 df_2002['year'] = 2002 # ... 依次给df_2003到df_2008添加对应年份的year列合并所有年度表为一个大表
用pd.concat把9个年度表纵向合并:# 把所有年度表放到一个列表里 annual_dfs_list = [df_2000, df_2001, df_2002, df_2003, df_2004, df_2005, df_2006, df_2007, df_2008] combined_annual_data = pd.concat(annual_dfs_list, ignore_index=True)透视年度表为宽表(将年份转为列)
这一步是核心:把每个年份的移民指标转成单独的列。假设你和主表的连接主键是country(替换成你实际的主键,比如地区代码、城市名等),指标列是total_migrants、female、male:# 透视操作 pivoted_annual = combined_annual_data.pivot( index='country', # 替换为你的连接主键列名 columns='year', values=['total_migrants', 'female', 'male'] ) # 给列重命名,让列名更直观(比如total_migrants_2000) pivoted_annual.columns = [f"{metric}_{year}" for metric, year in pivoted_annual.columns] # 重置索引,让主键列回到普通列 pivoted_annual = pivoted_annual.reset_index()和主表做外连接
用pd.merge执行外连接,确保主表和年度表的所有数据都被保留:# 假设你的主表是main_df final_merged_df = pd.merge( main_df, pivoted_annual, on='country', # 替换为实际主键列名 how='outer' )
方法二:循环逐个合并(适合需要逐表调整的场景)
如果你需要对每个年度表单独做一些预处理,也可以用循环逐个合并到主表:
# 先复制主表作为最终结果的初始版本 final_merged_df = main_df.copy() # 循环2000到2008年 for year in range(2000, 2009): # 获取对应年份的DataFrame(假设你的年度表命名是df_{年份}) current_year_df = locals()[f'df_{year}'] # 重命名指标列,加上年份后缀 renamed_year_df = current_year_df.rename(columns={ 'total_migrants': f'total_migrants_{year}', 'female': f'female_{year}', 'male': f'male_{year}' }) # 外连接到主表 final_merged_df = pd.merge( final_merged_df, renamed_year_df, on='country', # 替换为实际主键列名 how='outer' )
关键注意事项
- 确保主键一致:主表和所有年度表的连接主键(比如
country)必须列名相同、数据类型一致(比如都是字符串类型的国家代码),否则会出现匹配失败或重复数据。 - 处理缺失值:外连接后,没有对应数据的位置会填充
NaN,你可以用final_merged_df.fillna(0)(如果缺失代表0)或其他逻辑处理。 - 清理冗余列:合并前可以用
df.drop(columns=['多余列名'])删掉年度表中不需要的列,减少最终表的冗余。
内容的提问来源于stack exchange,提问作者Said Akbar
相关产品推荐
相关产品推荐

