You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python循环追加CSV文件并添加指定列时类引用异常求助

解决CSV合并时添加来源名称的问题

嘿,我来帮你搞定这个问题!你说脚本能正确遍历每个CSV,但只返回一个类引用,大概率是在合并DataFrame或者添加来源列的环节出了问题。下面我给你一步步拆解解决方案,附上完整的可运行代码。

核心思路

你的需求本质是:遍历存储在DataFrame里的CSV路径,给每个读取后的DataFrame添加对应来源名称,最后合并成一个大DataFrame。关键要确保每一行的CSV路径和来源名称一一对应,并且每次读取后都把带来源列的临时DataFrame合并到结果里。

完整代码示例

假设你的原始DataFrame(df)包含两列:name(用来作为新增列的来源名称)和file_path(CSV文件的路径),代码如下:

import pandas as pd

# 读取存储CSV路径和名称的DataFrame
df = pd.read_csv("你的路径列表文件.csv")  # 替换成你的实际文件路径

# 初始化空的合并结果DataFrame
merged_result = pd.DataFrame()

# 遍历每一行,获取来源名称和CSV路径
for _, row in df.iterrows():
    source_name = row["name"]
    csv_file = row["file_path"]
    
    # 读取单个CSV文件到临时DataFrame
    temp_df = pd.read_csv(csv_file)
    
    # 给临时DataFrame添加来源名称列
    temp_df["source_name"] = source_name
    
    # 合并到结果中(ignore_index=True避免索引重复)
    merged_result = pd.concat([merged_result, temp_df], ignore_index=True)

# 查看合并后的结果
print(merged_result.head())

为什么你的代码可能出错?

  • 可能误用了已弃用的append()方法:pandas从2.0版本开始弃用DataFrame.append(),用它可能导致奇怪的返回结果,换成pd.concat()就没问题了。
  • 没有正确迭代行数据:如果只取了df的某一列而非遍历每一行,会导致只处理最后一个文件或者返回对象引用。
  • 忘记设置ignore_index=True:合并时不重置索引会导致索引混乱,后续操作可能出问题。

优化建议(可选)

如果你的CSV文件数量多或者体积大,可以加个异常处理避免脚本崩溃,还能看到处理进度:

import pandas as pd

df = pd.read_csv("你的路径列表文件.csv")
merged_result = pd.DataFrame()

for idx, row in df.iterrows():
    source_name = row["name"]
    csv_file = row["file_path"]
    try:
        temp_df = pd.read_csv(csv_file)
        temp_df["source_name"] = source_name
        merged_result = pd.concat([merged_result, temp_df], ignore_index=True)
        print(f"✅ 已合并: {csv_file} (来源: {source_name})")
    except FileNotFoundError:
        print(f"❌ 警告: 文件不存在 - {csv_file}")
    except Exception as e:
        print(f"❌ 处理 {csv_file} 出错: {str(e)}")

print("\n合并完成!前5行数据如下:")
print(merged_result.head())

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:59:29