如何保留连续变量的同时按指定字段匹配CSV行到对应输出文件夹?
解决方案
直接修正现有代码(适合新手理解)
你的问题出在循环里直接把整行解包给4个变量,而row包含了height和temp两个额外字段,导致解包失败。只需要明确提取需要匹配的4个字段即可,不用删除连续变量:
import pandas as pd import os # 读取lookup表 lookup_df = pd.read_csv('lookup.csv') # 构建匹配字典,键是4个字段的元组 folder_map = lookup_df.set_index(['dwelling', 'wall', 'weather', 'occ'])['folder'].to_dict() # 读取输入数据 input_df = pd.read_csv('input.csv') # 保存初始工作目录,避免切换目录后混乱 original_dir = os.getcwd() for _, row in input_df.iterrows(): # 明确提取用于匹配的4个字段,保留height和temp在row中 key = (row['dwelling'], row['wall'], row['weather'], row['occ']) folder = folder_map[key] # 用绝对路径操作,避免频繁切换目录(更稳妥) target_dir = os.path.join(original_dir, folder) # 确保目标文件夹存在(可选,防止报错) os.makedirs(target_dir, exist_ok=True) # 示例操作:将当前行(包含所有字段)追加到目标文件夹的CSV row.to_frame().T.to_csv( os.path.join(target_dir, 'output.csv'), mode='a', header=not os.path.exists(os.path.join(target_dir, 'output.csv')), index=False )
高效优化方案(针对50万行大文件)
iterrows()逐行处理50万行数据速度很慢,推荐用pandas的merge先匹配文件夹字段,再按文件夹批量处理,效率提升显著:
import pandas as pd import os # 读取lookup表和输入数据 lookup_df = pd.read_csv('lookup.csv') input_df = pd.read_csv('input.csv') # 合并表:将folder字段匹配到输入数据的每一行 merged_df = pd.merge(input_df, lookup_df, on=['dwelling', 'wall', 'weather', 'occ'], how='left') # 按folder分组批量处理 for folder, group in merged_df.groupby('folder'): target_dir = os.path.join(os.getcwd(), folder) os.makedirs(target_dir, exist_ok=True) # 将当前组的所有数据(含height、temp)保存到目标文件夹 group.to_csv(os.path.join(target_dir, 'output.csv'), index=False)
关键修改说明
- 不再直接解包整行,通过列名精准提取匹配字段,保留
height和temp数据 - 用绝对路径替代
os.chdir,避免路径混乱 - 批量处理方案利用pandas向量化特性,比逐行循环效率提升数十倍,更适合大文件场景
内容的提问来源于stack exchange,提问作者Loz
相关产品推荐
相关产品推荐

