如何基于CSV文件不同列的唯一值进行多次拆分?
解决CSV文件两次拆分的方案
嘿,我来帮你搞定这个两次拆分CSV的需求!你之前先拆第1列再存文件到txt当变量的思路有点绕,其实可以用更简洁高效的方式直接完成两次拆分,完全不用中间的txt文件。我推荐用Python的pandas库来实现,它处理CSV的分组和拆分特别顺手。
实现思路
- 读取原始CSV文件,按第1列的唯一值分组,把每个组保存成单独的CSV文件;
- 遍历第一次拆分出来的所有CSV文件,再对每个文件按第7列的唯一值再次分组,保存最终的拆分文件;
- 用层级文件夹整理拆分后的文件,避免文件名混乱。
完整代码示例
import pandas as pd import os # 配置路径:替换成你的原始CSV路径和输出根目录 original_csv_path = "你的原始文件.csv" output_root_dir = "csv_split_results" # 创建输出根目录(不存在则自动创建) os.makedirs(output_root_dir, exist_ok=True) # 第一步:按第1列拆分原始CSV print("开始第一次拆分(按第1列)...") df = pd.read_csv(original_csv_path) # 注意:iloc[:,0]对应第1列(pandas是0索引),如果你的第1列有列名,可直接替换成列名字符串,比如df.groupby("列名") for group_name, group_df in df.groupby(df.iloc[:, 0]): # 处理组名中的特殊字符,避免生成非法文件名 safe_group_name = str(group_name).replace("/", "_").replace("\\", "_").replace(":", "_") first_split_path = os.path.join(output_root_dir, f"first_split_{safe_group_name}.csv") group_df.to_csv(first_split_path, index=False) print(f"已生成第一次拆分文件:{first_split_path}") # 第二步:遍历第一次拆分的文件,按第7列再次拆分 print("\n开始第二次拆分(按第7列)...") for first_split_file in os.listdir(output_root_dir): if not first_split_file.endswith(".csv"): continue first_split_path = os.path.join(output_root_dir, first_split_file) sub_df = pd.read_csv(first_split_path) # iloc[:,6]对应第7列(0索引),同样可替换成列名字符串 for second_group_name, second_group_df in sub_df.groupby(sub_df.iloc[:, 6]): safe_second_name = str(second_group_name).replace("/", "_").replace("\\", "_").replace(":", "_") # 提取第一次拆分的组名,用于命名最终文件和创建子文件夹 first_group_name = first_split_file.replace("first_split_", "").replace(".csv", "") final_output_dir = os.path.join(output_root_dir, first_group_name) os.makedirs(final_output_dir, exist_ok=True) final_file_path = os.path.join(final_output_dir, f"{first_group_name}_{safe_second_name}.csv") second_group_df.to_csv(final_file_path, index=False) print(f"已生成最终拆分文件:{final_file_path}") # 可选:如果不需要保留第一次拆分的中间文件,取消下面一行的注释即可删除 # os.remove(first_split_path) print("\n所有拆分操作完成!")
代码说明
- 路径配置:记得把
original_csv_path和output_root_dir替换成你自己的实际文件路径; - 列索引:代码里用
iloc[:,0]表示第1列,iloc[:,6]表示第7列(因为pandas是从0开始计数的),如果你的CSV有明确的列名,直接把df.iloc[:,0]换成列名字符串(比如"user_id")会更稳妥; - 文件名处理:用
replace处理了特殊字符,避免生成系统无法识别的非法文件名; - 中间文件:如果不需要第一次拆分的中间文件,可以把最后那段注释的删除代码取消注释。
这个方法一步到位,不用手动处理txt文件,逻辑清晰且出错概率更低。如果你的CSV文件特别大,也可以考虑用分块读取的方式优化内存占用,不过一般情况下上面的代码足够用了。
内容的提问来源于stack exchange,提问作者rajanan
相关产品推荐
相关产品推荐

