合并多Excel抽取的DataFrame指定列时最终表行数受限如何解决
问题原因
Pandas对DataFrame进行列赋值时遵循索引对齐规则:你第一次给df_final赋值列时,df_final的索引范围就和第一个导入的DataFramedf_i的索引完全一致。后续给df_final赋值其他列时,只会匹配两个对象中同时存在的索引值,新导入列超出原有索引范围的行数据会被直接丢弃,不会自动触发df_final的行数扩展;如果新导入列的行数少于df_final现有行数,缺失位置会自动填充NaN。
解决方法
这里提供三种不同场景下的常用解决方案:
- 方案1:统一拼接所有目标列(推荐,性能最优)
读取每个Excel时先抽取出需要的列转为Series,统一存入列表后再用pd.concat按列拼接,自动适配最大行数,缺失位置补NaN。
import pandas as pd # 存储所有待合并的列 target_cols = [] excel_paths = ["文件1.xlsx", "文件2.xlsx", "文件3.xlsx"] # 替换为你的Excel路径列表 for path in excel_paths: df_i = pd.read_excel(path) # 抽取指定列,可自定义列名避免冲突 s = df_i["指定列名"] s.name = "自定义列名" # 这里改成你需要的列名 target_cols.append(s) # 按列合并得到最终结果 df_final = pd.concat(target_cols, axis=1)
- 方案2:保留逐次赋值逻辑,每次先扩展索引
如果需要保持你原有逐次赋值的代码结构,每次赋值前先把df_final的索引扩展到当前的最大行数,再进行列赋值。
import pandas as pd df_final = pd.DataFrame() all_dfs = [] # 替换为你读取得到的所有单个DataFrame列表 for df_i in all_dfs: col_name = "需要的列名" # 计算当前需要的最大行数 max_row = max(len(df_final), len(df_i)) # 扩展df_final索引,无数据位置补NaN df_final = df_final.reindex(range(max_row)) # 再执行列赋值 df_final[col_name] = df_i[col_name]
- 方案3:无索引对齐需求时直接补全长度
如果你不需要保留原始DataFrame的索引,只是要把每列的内容按顺序堆叠,超出其他列长度的部分下方补NaN,可以先把所有列转为列表并补全到相同长度,再构造最终DataFrame:
max_len = max([len(df_i["指定列名"]) for df_i in all_dfs]) data_dict = {} for df_i in all_dfs: col_data = df_i["指定列名"].tolist() # 补全到最大长度 col_data += [pd.NA] * (max_len - len(col_data)) data_dict["自定义列名"] = col_data df_final = pd.DataFrame(data_dict)
内容的提问来源于stack exchange,提问作者pedro_galher
相关产品推荐
相关产品推荐

