如何在Python Pandas中替换DataFrame列中含逗号的指定值?
Pandas 数据清洗需求实现方案
问题背景
给定如下Pandas DataFrame:
import pandas as pd df = pd.DataFrame() df["COL1"] = [111,222,333] df["COL2"] = ["CV_COUNT_ABC_XM_BF, CV_COUNT_DEF_XM_BF", "CV_COUNT_DEF_XM_ BF", "LACK"] df["COL3"] = ["LACK", "CV_COUNT_ABC_XM_BF, CV_COUNT_DEF_XM_BF", "CV_COUNT_DEF_XM_ BF xx"]
原始数据样例:
COL1 | COL2 | COL3 -------|------------------------------------------|--------- 111 | CV_COUNT_ABC_XM_BF, CV_COUNT_DEF_XM_BF | LACK 222 | CV_COUNT_DEF_XM_ BF | CV_COUNT_ABC_XM_BF, CV_COUNT_DEF_XM_BF 333 | LACK | CV_COUNT_DEF_XM_ BF xx ... | ... | ...
需求说明
- 若COL2或COL3仅为"LACK",则保持不变
- 若COL2或COL3包含"ABC"或"DEF",仅保留"ABC"或"DEF";原内容逗号分隔的多个值,处理后仍保留逗号分隔格式
- 删除列中除"ABC"、"DEF"、逗号或"LACK"之外的所有其他内容(如ID=333的COL3中的"xx")
期望结果
COL1 | COL2 | COL3 -------|------------------------------------------|--------- 111 | ABC, DEF | LACK 222 | DEF | ABC, DEF 333 | LACK | DEF ... | ... | ...
解决方案
通过自定义清洗函数结合apply方法实现,核心是精准提取目标关键词并处理格式:
import pandas as pd import re def clean_col(value): # 处理纯LACK的情况 if value.strip() == "LACK": return "LACK" # 提取所有ABC或DEF关键词 matches = re.findall(r'(ABC|DEF)', value) # 按逗号分隔格式返回结果,无匹配则返回LACK return ', '.join(matches) if matches else "LACK" # 对目标列应用清洗函数 df['COL2'] = df['COL2'].apply(clean_col) df['COL3'] = df['COL3'].apply(clean_col) # 查看结果 print(df)
代码说明
- 正则提取:用
re.findall(r'(ABC|DEF)', value)精准抓取内容中的"ABC"或"DEF",忽略其他无关字符 - 边界判断:先检查单元格是否为纯"LACK",直接返回;若未匹配到目标关键词,同样返回"LACK"
- 格式保持:将提取到的关键词用
,连接,还原原有的逗号分隔多值格式
运行后即可得到符合需求的清洗结果。
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

