如何将pandas DataFrame列的多值单元格拆分到独立行
pandas多列有序同步拆分实现方案
现有代码问题说明
- 第二种方案核心错误:调用
pd.read_csv时误将文件路径字符串通过io.StringIO当成文件内容读取,导致返回空DataFrame - 第一种方案仅处理单列,没有对
business列做对应拆分,无法实现多列同步映射
实现代码
依赖导入
import pandas as pd import glob from pathlib import Path
核心拆分函数
def split_multi_columns(df): # 拆分name列为列表,自动忽略逗号前后的空格 df['name'] = df['name'].str.split(r'\s*,\s*') # 按规则拆分business列,保证拆分后的列表长度和name列完全对应 df['business'] = df['business'].str.extractall(r"(?:[\s,]*)(.*?(?:Unspecified|employees|Self-employed))").groupby(level=0).agg(list) # 多列同步拆分生成独立行,其余列自动保留原值 df = df.explode(['name', 'business'], ignore_index=True) return df
批量文件处理逻辑
review_path = r'data/base_data' review_files = glob.glob(review_path + "/*.csv") for review_file in review_files: # 修正读取逻辑,直接读取本地csv文件,分隔符根据实际文件格式调整 df = pd.read_csv(review_file, sep=',') df = split_multi_columns(df) # 输出处理后文件,默认添加processed_前缀避免覆盖原始文件 out_put_path = Path(review_path) / f'processed_{Path(review_file).name}' df.to_csv(out_put_path, index=False) print(f'文件处理完成:{review_file}') print(df.head())
逻辑说明
- 正则匹配规则保证
business列拆分后的列表长度和name列拆分后的列表长度完全一致,explode时会按顺序一一对应,不会出现错位 - 无需拆分的列会自动在拆分生成的所有新行中保留原始值
- 如果需要新增其他需要同步拆分的列,只需在函数中补充对应拆分逻辑,再把列名加入
explode的参数列表即可
内容的提问来源于stack exchange,提问作者Sizzler
相关产品推荐
相关产品推荐

