求助:Pandas合并多DataFrame出现NaN,如何得到指定格式结果
解决DataFrame合并后出现对角线NaN的问题
问题原因
出现对角线分布的NaN,通常是以下两种情况:
- 各DataFrame的列名存在隐性差异(比如列名前后有空格、大小写不一致),导致concat时自动扩充列,不同列名的位置填充NaN;
- 未重置索引,且各DataFrame的索引重复,视觉上呈现类似对角线的分布效果。
解决方案
1. 先统一列名(关键步骤)
先检查每一个DataFrame的列名是否完全一致:
# 遍历打印所有df的列名,排查差异 for idx, df in enumerate([df1, df2, df3, df4, df5, df6, df7], 1): print(f"df{idx} 列名: {list(df.columns)}")
如果发现列名有空格、大小写不一致等问题,统一修正:
# 去除列名前后空格并转为小写(可根据实际调整规则) for df in [df1, df2, df3, df4, df5, df6, df7]: df.columns = df.columns.str.strip().str.lower()
2. 合并并提取目标列
列名统一后,重新合并并只保留amount列,同时重置索引避免重复:
# 方案一:先合并所有df,再提取amount列 frames = [df1, df2, df3, df4, df5, df6, df7] result = pd.concat(frames, ignore_index=True)[["amount"]] # 方案二:合并前只提取每个df的amount列,更高效 frames = [df["amount"] for df in [df1, df2, df3, df4, df5, df6, df7]] result = pd.concat(frames, ignore_index=True).to_frame(name="amount")
3. 额外排查:是否存在表头重复导入的情况
如果你的DataFrame是从文件读取的,可能误把表头行当成了数据行(比如每个文件都有name sub amount这行),需要先清洗:
for df in [df1, df2, df3, df4, df5, df6, df7]: # 过滤掉amount列无法转为数字的行(即表头行) df = df[pd.to_numeric(df["amount"], errors="coerce").notna()] df.reset_index(drop=True, inplace=True)
内容的提问来源于stack exchange,提问作者kiwi_kimchi
相关产品推荐
相关产品推荐

