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

批量处理CSV计算VWAP列合并到DataFrame时TypeError报错求解

报错原因

你代码的报错核心是pd.concat()的入参格式错误:add(f)函数返回的是单个DataFrame对象,但pd.concat要求入参必须是由pandas对象(DataFrame/Series)组成的可迭代结构(比如列表、元组),直接传入单个DataFrame就会触发该类型错误。

同时你现有逻辑还有两处冗余/问题:

  1. add()函数内部已经调用了pd.read_csv(f)读取文件,外层循环又读了一次,属于重复IO操作
  2. 循环追加写入CSV时没有控制表头写入逻辑,会导致最终结果文件里每隔一段就重复出现表头

修复方案

场景1:每个CSV处理完(加vwap列)后合并到同一个结果CSV

直接删掉多余的pd.concat调用,追加写入时判断是否是第一个文件,只有第一个文件写表头即可:

import pandas as pd
import os
import glob

path = os.getcwd()
csv_files = glob.glob(os.path.join("*.csv"))
# 结果保存路径
save_path = r"C:\Users\vion1\Ele\Engie\Sorbonne\resultat\resultat_projet_4.csv"

def add(f):
    df = pd.read_csv(f, header=0)
    df["timestamp"] = pd.to_datetime(df["timestamp"])
    df = df.groupby(pd.Grouper(key = "timestamp", freq = "h")).agg("mean").reset_index()
    price = df["price"]
    amount = df["amount"]
    # 在这里给vwap加文件名后缀,避免多个文件的列名重复
    file_tag = os.path.basename(f).strip(".csv")
    return df.assign(**{f"vwap_{file_tag}": (price * amount).cumsum() / amount.cumsum()})

for idx, f in enumerate(csv_files):
    processed_df = add(f)
    # 只有第一个文件写表头,后续文件只追加数据
    processed_df.to_csv(save_path, encoding='utf-8', index=False, mode = "a", header=idx==0)

场景2:要把10个CSV的VWAP作为10个独立列,按时间戳对齐合并到同一个DataFrame

如果你的需求是最终得到一个每行对应一个小时、10列分别是10个文件的VWAP结果的表,可以用以下写法:

import pandas as pd
import os
import glob

path = os.getcwd()
csv_files = glob.glob(os.path.join("*.csv"))
save_path = r"C:\Users\vion1\Ele\Engie\Sorbonne\resultat\resultat_projet_4.csv"

vwap_list = []
for f in csv_files:
    df = pd.read_csv(f, header=0)
    df["timestamp"] = pd.to_datetime(df["timestamp"])
    df = df.groupby(pd.Grouper(key = "timestamp", freq = "h")).agg("mean").reset_index()
    # 计算vwap
    vwap = (df["price"] * df["amount"]).cumsum() / df["amount"].cumsum()
    file_tag = os.path.basename(f).strip(".csv")
    # 生成只带时间戳和当前文件vwap的df,用于后续合并
    temp_df = df[["timestamp"]].assign(**{f"vwap_{file_tag}": vwap})
    vwap_list.append(temp_df)

# 按时间戳合并所有文件的vwap列
final_df = vwap_list[0]
for temp in vwap_list[1:]:
    final_df = pd.merge(final_df, temp, on="timestamp", how="outer")

final_df.to_csv(save_path, encoding='utf-8', index=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:36:03