Pandas多CSV文件指定列合并异常问题求助
解决Pandas合并多CSV指定列的问题
我来帮你搞定这个CSV合并的问题!你的代码现在遇到的覆盖、数据挤在单个单元格的问题,主要是路径处理、DataFrame创建方式和多列/多文件处理逻辑的问题,咱们一步步修正:
先分析你现有代码的问题
- 路径转义错误:Windows路径里的
\会被Python当成转义字符(比如\b会被解析为退格符),导致路径识别异常。 - 单个单元格问题:你把
column_to_save(一个Series)放到列表[column_to_save]里作为字典值,这会让整个Series变成DataFrame的一个单元格,而不是独立的一列。 - 覆盖问题:当前代码只处理了单个文件,且每次运行都会直接覆盖目标CSV,没有实现多列/多文件的累加合并。
- 多列未处理:代码只提取了
C1 in V一列,没有同时处理你需要的三列。
解决方案1:处理单个CSV的多列合并
如果只是要从单个CSV里提取C1 in V、C2 in V、C3 in V三列保存到新CSV,用下面的代码:
import pandas as pd # 用原始字符串(r前缀)避免路径转义问题 source_file_path = r"E:\bachelor thesis materials\TrainData\CSV\Forward_2_4\F358\CH1.CSV" target_file_path = r"E:\bachelor thesis materials\1d\Forward_1.csv" # 读取源CSV,直接提取需要的三列(双层方括号返回DataFrame,而非单个Series) source_df = pd.read_csv(source_file_path) columns_to_keep = ['C1 in V', 'C2 in V', 'C3 in V'] # 可选:检查列是否存在,避免报错 if all(col in source_df.columns for col in columns_to_keep): selected_df = source_df[columns_to_keep] # 保存到目标CSV,index=False不保存索引列 selected_df.to_csv(target_file_path, index=False) else: print("源文件中缺少指定的列!")
解决方案2:合并多个CSV的指定列
如果要把目录下所有CSV里的这三列合并到同一个目标CSV(行追加),可以用glob遍历文件,再用pd.concat合并:
import pandas as pd import glob import os # 存放所有源CSV的目录路径 source_dir = r"E:\bachelor thesis materials\TrainData\CSV\Forward_2_4\F358" target_file_path = r"E:\bachelor thesis materials\1d\Forward_1.csv" # 获取目录下所有CSV文件(注意大小写,你的文件是.CSV,所以用*.CSV) csv_files = glob.glob(f"{source_dir}/*.CSV") # 初始化空DataFrame用来存放所有合并后的数据 combined_df = pd.DataFrame() for file in csv_files: print(f"正在处理文件:{file}") df = pd.read_csv(file) # 筛选出当前文件中存在的目标列 available_columns = [col for col in ['C1 in V', 'C2 in V', 'C3 in V'] if col in df.columns] if available_columns: selected_df = df[available_columns] # 把当前文件的列追加到总DataFrame,ignore_index重置索引避免重复 combined_df = pd.concat([combined_df, selected_df], axis=0, ignore_index=True) else: print(f"文件{file}中没有找到指定列,跳过") # 保存最终合并结果 if not combined_df.empty: # 检查目标文件是否存在,存在则追加(不写表头),不存在则新建(写表头) if os.path.exists(target_file_path): combined_df.to_csv(target_file_path, mode='a', header=False, index=False) else: combined_df.to_csv(target_file_path, index=False) print("合并完成!") else: print("没有找到符合要求的数据,未生成文件")
关键细节说明
- 原始字符串路径:所有路径前加
r,比如r"E:\xxx",避免Python解析转义字符导致路径错误。 - 多列提取:用双层方括号
[['列1','列2']]获取DataFrame,而不是单层方括号的Series,这样数据会以列的形式保存,不会挤在一个单元格。 - 多文件合并:
pd.concat的axis=0表示按行追加(每个文件的行接在后面),如果需要按列合并(每个文件的列并排),可以把axis改成1,但要确保所有文件的行数一致。 - 避免重复覆盖:用
mode='a'实现追加写入,同时第一次写入时写表头,后续追加不写表头,避免重复表头。
内容的提问来源于stack exchange,提问作者Jin
相关产品推荐
相关产品推荐

