批量处理CSV计算VWAP列合并到DataFrame时TypeError报错求解
报错原因
你代码的报错核心是pd.concat()的入参格式错误:add(f)函数返回的是单个DataFrame对象,但pd.concat要求入参必须是由pandas对象(DataFrame/Series)组成的可迭代结构(比如列表、元组),直接传入单个DataFrame就会触发该类型错误。
同时你现有逻辑还有两处冗余/问题:
add()函数内部已经调用了pd.read_csv(f)读取文件,外层循环又读了一次,属于重复IO操作- 循环追加写入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
相关产品推荐
相关产品推荐

