
本文介绍一种结合concat与逐次merge的策略,将多个按月采集的dataframe按id_number对齐,生成宽格式结果表,其中每个income_i列对应第i个月的收入值,缺失值补0。
本文介绍一种结合concat与逐次merge的策略,将多个按月采集的dataframe按id_number对齐,生成宽格式结果表,其中每个income_i列对应第i个月的收入值,缺失值补0。
在处理多期时间序列数据(如月度业务报表)时,常需将多个结构相同、但ID集合有交集或差异的DataFrame整合为统一宽表——既保留所有历史ID,又为每期收入单独建列。核心挑战在于:**既要基于id_number横向对齐(类似left join),又要纵向补全新增ID,并确保非Income字段仅保留首次出现的值**。推荐采用“先归一化主键骨架,再逐期注入数值”的两阶段法,避免嵌套merge带来的索引混乱和性能损耗:
- 构建唯一ID主干表:使用pd.concat()垂直堆叠所有DataFrame,仅保留id_number及非数值维度列(如company、type),通过drop_duplicates('id_number')确保每个ID仅保留首次出现的记录(满足“同ID优先取旧值”要求);
- 逐期注入Income列:遍历原始DataFrame列表,利用set_index('id_number')['Income'].reindex(..., fill_value=0)实现精准对齐——reindex会自动按目标表的id_number顺序排列,缺失ID补0,完美匹配需求。
以下是完整可运行代码示例:
import pandas as pd
# 构造示例数据
data_22_3 = {'id_number': ['A123', 'B456', 'C789'], 'company': ['Insurance1', 'Insurance2', 'Insurance3'], 'type': ['A', 'A', 'C'], 'Income': [100, 200, 300]}
data_22_4 = {'id_number': ['A123', 'B456', 'D012'], 'company': ['Insurance1', 'Insurance2', 'Insurance1'], 'type': ['A', 'B', 'B'], 'Income': [150, 250, 400]}
data_22_5 = {'id_number': ['A123', 'C789', 'E034'], 'company': ['Insurance1', 'Insurance3', 'Insurance5'], 'type': ['A', 'C', 'B'], 'Income': [180, 320, 500]}
df_22_3, df_22_4, df_22_5 = pd.DataFrame(data_22_3), pd.DataFrame(data_22_4), pd.DataFrame(data_22_5)
dfs = [df_22_3, df_22_4, df_22_5]
# 步骤1:构建ID主干(保留首次出现的company/type)
result = (
pd.concat(dfs, ignore_index=True)
.drop(columns='Income')
.drop_duplicates('id_number')
.reset_index(drop=True)
)
# 步骤2:逐期添加Income_i列
for i, df in enumerate(dfs, start=1):
result[f'Income_{i}'] = (
df.set_index('id_number')['Income']
.reindex(result['id_number'], fill_value=0)
.values # .values确保返回numpy数组,避免索引对齐副作用
)
# 可选:将Income_1重命名为Income以符合习惯
result = result.rename(columns={'Income_1': 'Income'})
print(result)
关键注意事项:
- reindex(..., fill_value=0) 是核心技巧,它比merge更轻量且可控,避免了how='right'或how='outer'引入冗余行;
- .values 后缀强制转换为数组,防止Pandas因索引未对齐导致隐式广播错误;
- 若原始数据中存在重复id_number(同一期多条记录),需预先按业务逻辑去重(如取最大Income),本方案不处理期内重复;
- 扩展性强:只需修改dfs列表和循环逻辑,即可支持任意期数,无需硬编码列名。
该方法兼具清晰性、健壮性与可维护性,是处理此类“ID对齐+时序宽表化”任务的推荐实践。










