如何从两个独立文件取数为pandas DataFrame追加新行
配对特征标签文件构建DataFrame修复方案
原有代码问题
- 无文件配对逻辑:遍历过程中单独处理xlsx和csv文件,未将同组的特征、标签文件做关联,直接给DataFrame列赋值会导致全表数据被覆盖,出现数据错乱
- 赋值逻辑错误:初始创建的模板DataFrame只有1行占位数据,循环中没有按组做行追加,反复覆盖列值会导致结构损坏
- 路径读取错误:
os.listdir仅返回文件名,未拼接文件夹完整路径,直接传入读取方法会触发文件不存在报错 - 字段取值错误:重复给
consolidating列赋值,标签文件列名、取值索引不匹配,无法正确读取目标字段
正确实现代码
核心思路是先按文件类型分组,通过文件名的共同前缀做配对匹配,逐组读取两个文件的字段拼接为完整行,最后一次性生成目标DataFrame,避免循环中反复修改DataFrame结构。
import os import pandas as pd # 替换为你的文件存放目录路径 DATA_DIR = "path/to/your/files" # 目标表列配置 TARGET_COLS = ["periods","opens","highs","lows","closes","volumes","consolidating", "5D Perf"] # 收集目录下所有特征、标签文件,以文件共同前缀作为配对键 file_collect = {"features": dict(), "labels": dict()} for fname in os.listdir(DATA_DIR): full_path = os.path.join(DATA_DIR, fname) # 跳过子文件夹,仅处理文件 if not os.path.isfile(full_path): continue if "features.xlsx" in fname: # 提取配对键:去掉特征文件固定后缀,剩余部分作为同组匹配标识 pair_key = fname.replace("_features.xlsx", "") file_collect["features"][pair_key] = full_path elif "labels.csv" in fname: pair_key = fname.replace("_labels.csv", "") file_collect["labels"][pair_key] = full_path # 筛选同时存在特征、标签的有效配对组 valid_pairs = file_collect["features"].keys() & file_collect["labels"].keys() if not valid_pairs: raise RuntimeError("目录下未找到可匹配的特征、标签文件对") # 逐组读取数据拼接 rows = [] for key in valid_pairs: # 读取特征文件字段 feat_df = pd.read_excel(file_collect["features"][key]) periods_val = feat_df.shape[0] - 1 opens_val = feat_df["Open"].tolist() highs_val = feat_df["High"].tolist() lows_val = feat_df["Low"].tolist() closes_val = feat_df["Close"].tolist() volumes_val = feat_df["Volume"].tolist() # 读取标签文件字段 label_df = pd.read_csv(file_collect["labels"][key]) # 可根据标签文件实际存储位置调整iloc索引 consolidating_val = label_df["Consolidating"].iloc[0] five_d_perf_val = label_df["5D Performance"].iloc[0] rows.append([ periods_val, opens_val, highs_val, lows_val, closes_val, volumes_val, consolidating_val, five_d_perf_val ]) # 生成最终DataFrame final_df = pd.DataFrame(rows, columns=TARGET_COLS)
适配调整说明
- 如果你的文件命名规则不是
前缀_features.xlsx/前缀_labels.csv格式,修改配对键提取逻辑即可,只要保证同组两个文件提取的pair_key完全一致即可正常配对 - 如果标签文件内的字段存储行号和示例不同,调整
iloc[]内的索引值即可(索引从0开始计数,0对应第一行) - 可增加如下代码排查缺失配对的文件:
# 排查缺失配对的文件 miss_feat = file_collect["labels"].keys() - file_collect["features"].keys() miss_label = file_collect["features"].keys() - file_collect["labels"].keys() if miss_feat: print(f"无对应特征文件的标签组:{miss_feat}") if miss_label: print(f"无对应标签文件的特征组:{miss_label}")
- 采用先存行列表最后一次性生成DataFrame的方式,比循环中逐行追加/修改DataFrame效率高5~10倍,也不会出现索引错位、列覆盖的问题
内容的提问来源于stack exchange,提问作者Dodo
相关产品推荐
相关产品推荐

