如何基于多条件拆分DataFrame列并生成对应ID与描述字段
解决方案
方法1:拆分为单行单条记录(推荐,方便后续分析)
这种方法会把同一行的多个CPV条目拆分为独立行,保留原有其他列的所有信息,适合绝大多数后续分析场景。
import pandas as pd # 假设你的原始DataFrame叫df # 1. 按|拆分多值条目,展开为多行 df_exploded = df.assign(cpv=df['cpv'].str.split(r'\s*\|\s*')).explode('cpv', ignore_index=False) # 2. 拆分ID和描述,n=1保证描述中出现的-不会被误拆分 df_exploded[['cpvid', 'cpvdescription']] = df_exploded['cpv'].str.split(r'\s+-\s+', n=1, expand=True) # 3. 可选:删除原cpv列 df_final = df_exploded.drop(columns='cpv')
参数说明:
- 拆分
|的正则\s*\|\s*:自动忽略分隔符前后的多余空格,避免拆分后字符串首尾带空格 str.split的*n=1*参数:仅拆分第一个匹配到的-,避免描述内容中存在-时被误拆分explode的*ignore_index=False*参数:保留原始行的索引,方便你回溯原始数据行,不需要可以改为True重置索引
注意:如果原始
cpv列存在空值,可以先执行df = df.dropna(subset=['cpv'])过滤空行,避免拆分时出现异常。
方法2:保留原始行结构,ID和描述存储为列表
如果不需要拆分行为多行,希望每行还是对应原始的一条数据,可以用提取+分组聚合的方式:
# 提取所有cpvid和cpvdescription,按原始行索引分组聚合为列表 extract_df = df['cpv'].str.extractall(r'(?P<cpvid>[\d-]+)\s+-\s+(?P<cpvdescription>[^|]+)') extract_df['cpvdescription'] = extract_df['cpvdescription'].str.strip() # 按原始行索引聚合,合并到原DataFrame df[['cpvid', 'cpvdescription']] = extract_df.groupby(level=0).agg(list)
这种方式得到的cpvid和cpvdescription都是列表格式,对应原始行中所有的ID和描述。
内容的提问来源于stack exchange,提问作者Miguel Lopes
相关产品推荐
相关产品推荐

