如何查找pandas DataFrame指定列的公共子串并替换对应单元格值
pandas实现Solution Name列公共子串归一化+按Detail去重
实现代码
直接运行以下代码即可得到预期结果:
import pandas as pd # 构造原始测试数据 df = pd.DataFrame({ "Solution Name": ["Cleanser", "Cleanser(1+2)", "Cleanserx3", "Trial", "Incremental Trial"], "Detail": ["ContentA", "ContentA", "ContentB", "ContentC", "ContentC"] }) # 提取核心公共子串:筛选出被至少1个其他Solution Name包含的字符串 all_names = df["Solution Name"].unique() core_keys = [s for s in all_names if sum(s in other for other in all_names if s != other) > 0] # 将原Solution Name替换为匹配到的核心子串 df["Solution Name"] = df["Solution Name"].apply( lambda x: next((k for k in core_keys if k in x), x) ) # 联合两列去重,保留Detail不同的行 df = df.drop_duplicates(subset=["Solution Name", "Detail"]).reset_index(drop=True)
结果验证
运行后打印df输出完全符合预期:
| Solution Name | Detail |
|---|---|
| Cleanser | ContentA |
| Cleanser | ContentB |
| Trial | ContentC |
逻辑说明
- 核心子串识别不需要引入额外的字符串匹配库,直接利用子串包含关系判断:如果某个Solution Name值是其他至少一个值的子串,就认定为同组的统一公共子串
- 替换时逐行匹配第一个命中的核心子串即可,适配给出的所有样例场景
- 最后通过两列联合去重,自动过滤同组下同Detail的重复行,只保留Detail有差异的条目
内容的提问来源于stack exchange,提问作者Crazy
相关产品推荐
相关产品推荐

