Pandas高效合并多个年度CSV为指定宽格式DataFrame方法咨询
多份分年份人口CSV合并为规范宽表的高效实现方案
推荐优先使用「批量读入+长表转宽表」的实现方式,执行效率更高,扩展性更强,无需重复编写merge逻辑:
import pandas as pd # 按需修改年份列表即可,新增年份直接追加 years = [2010, 2012, 2014, 2016, 2018, 2020] df_pool = [] for y in years: # 读入单年数据 tmp = pd.read_csv(f"{y}.csv") # 标记当前数据对应的年份 tmp['year'] = y df_pool.append(tmp) # 合并所有数据为长表结构 total_df = pd.concat(df_pool, ignore_index=True) # 透视转换为预期的宽表结构 final_df = total_df.pivot( index=['state', 'gender'], columns='year', values='population' # 列名重命名为规范格式,重置索引把state、gender转为普通列 ).rename(columns=lambda x: f"population_{x}").reset_index()
该方案和你原本多次outer merge的效果完全一致,缺失的组合会自动填充NaN,无需额外处理。
如果你希望沿用merge的逻辑,也可以用reduce实现批量合并,避免手动重复写merge代码:
import pandas as pd from functools import reduce years = [2010, 2012, 2014, 2016, 2018, 2020] df_pool = [] for y in years: tmp = pd.read_csv(f"{y}.csv") # 读入时直接重命名population列,避免重名冲突 tmp = tmp.rename(columns={'population': f"population_{y}"}) df_pool.append(tmp) # 批量执行多表outer merge final_df = reduce( lambda left, right: pd.merge(left, right, on=['state', 'gender'], how='outer'), df_pool )
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

