如何按指定规则逐步合并多个月度进度Pandas DataFrame?
实现月度Pandas DataFrame按规则合并的方法
以下是完全符合要求的可运行实现代码:
import pandas as pd # 示例数据初始化(用户提供的原始数据) data_22_3 = { 'id_number': ['A123', 'B456', 'C789'], 'company': ['Insurance1', 'Insurance2', 'Insurance3'], 'type': ['A', 'A', 'C'], 'Income': [100, 200, 300] } df_22_3 = pd.DataFrame(data_22_3) data_22_4 = { 'id_number': ['A123', 'B456', 'D012'], 'company': ['Insurance1', 'Insurance2', 'Insurance1'], 'type': ['A', 'B', 'B'], 'Income': [150, 250, 400] } df_22_4 = pd.DataFrame(data_22_4) data_22_5 = { 'id_number': ['A123', 'C789', 'E034'], 'company': ['Insurance1', 'Insurance3', 'Insurance5'], 'type': ['A', 'C', 'B'], 'Income': [180, 320, 500] } df_22_5 = pd.DataFrame(data_22_5) # 合并逻辑实现 def merge_monthly_dfs(main_df, *monthly_dfs): # 初始化合并表,以第一个DataFrame为基础 merged_df = main_df.copy() # 遍历后续月度数据,从第2个开始给Income列编号 for idx, df in enumerate(monthly_dfs, start=2): # 提取当前月度的id和Income,重命名Income列 monthly_income = df[['id_number', 'Income']].rename(columns={'Income': f'Income_{idx}'}) # 左连接,保留主表所有原有行 merged_df = merged_df.merge(monthly_income, on='id_number', how='left') # 新加入的id,主表原始Income列填充0 merged_df['Income'] = merged_df['Income'].fillna(0) # 新id的company、type列用当前月度数据填充(主表无对应记录) for col in ['company', 'type']: merged_df[col] = merged_df[col].fillna(df.set_index('id_number')[col]) # 未在当前月度出现的id,对应月度Income列填充0 merged_df[f'Income_{idx}'] = merged_df[f'Income_{idx}'].fillna(0) # 重置索引保证连续性 merged_df = merged_df.reset_index(drop=True) return merged_df # 执行合并 all_df = merge_monthly_dfs(df_22_3, df_22_4, df_22_5) print(all_df)
核心逻辑说明
- 主表优先原则:始终以第一个DataFrame的
company、type等非Income列值为准,仅填充新id的缺失字段 - 月度Income列命名:后续每个DataFrame的Income列自动命名为
Income_2、Income_3... - 缺失值处理:
- 主表已有id:仅补充对应月度Income,其他字段不覆盖
- 主表无id:自动添加该行,主表原始Income填0,其他字段取当前月度数据
- 未在当前月度出现的id:对应月度Income填0
运行代码后将得到完全符合你期望的合并结果。
内容的提问来源于stack exchange,提问作者Ranger
相关产品推荐
相关产品推荐

