如何使用pandas处理多CSV文件时将各文件输出记录单独存为不同行
Pandas多CSV文件按文件为单位合并实现
原有实现
你当前使用的代码会将所有CSV的行纵向拼接,最终行数等于所有CSV的行数总和:
folder_name = 'Dataset_test' file_type = 'csv' seperator =',' df = pd.concat([pd.read_csv(f, sep=seperator) for f in glob.glob(folder_name + "/*."+file_type)],ignore_index=True)
改造方案
要实现1个CSV对应最终DataFrame的1行,可以参考以下两种常用实现:
方案1:全量内容序列化存储
适合需要保留CSV原始结构,后续可能需要恢复单个CSV数据的场景:
import pandas as pd import glob folder_name = 'Dataset_test' file_type = 'csv' seperator =',' csv_files = glob.glob(folder_name + "/*."+file_type) row_list = [] for file_path in csv_files: tmp = pd.read_csv(file_path, sep=seperator) row_list.append({ # 保留文件名做标识,可按需删除 "file_name": file_path.split("/")[-1], # 将CSV全量内容转为JSON字符串存储 "csv_raw_data": tmp.to_json(orient="records", force_ascii=False) }) # 生成最终结果,行数等于CSV文件数量 final_df = pd.DataFrame(row_list)
方案2:同列聚合为列表存储
适合需要直接对单个CSV的列做统计计算的场景:
import pandas as pd import glob folder_name = 'Dataset_test' file_type = 'csv' seperator =',' csv_files = glob.glob(folder_name + "/*."+file_type) row_list = [] for file_path in csv_files: tmp = pd.read_csv(file_path, sep=seperator) # 每列的所有值聚合为列表,生成单条记录 row_data = tmp.agg(list).to_dict() row_data["file_name"] = file_path.split("/")[-1] row_list.append(row_data) final_df = pd.DataFrame(row_list)
说明
- 方案1存储的
csv_raw_data字段可通过pd.read_json(final_df.loc[0, 'csv_raw_data'])恢复为对应CSV的原始DataFrame - 方案2的每个列字段都是列表类型,可直接使用
apply类方法做均值、计数等统计计算
内容的提问来源于stack exchange,提问作者Hassan Sajjad
相关产品推荐
相关产品推荐

