使用Pandas按指定列表规则过滤列并拆分符合50%占比要求的行
Pandas多参考列表匹配过滤+行拆分实现方案
实现逻辑
- 预处理参考列表,自动计算每个列表的50%匹配阈值(向上取整,如长度3的列表阈值为2、长度5的列表阈值为3)
- 拆分每行y列的逗号分隔字符串为集合,实现元素的快速匹配统计
- 逐行校验与所有参考列表的匹配元素数量,符合阈值要求的收集对应匹配元素
- 过滤无任何匹配的行,将多参考列表匹配结果拆分为独立行,保留原x、z列的取值
完整代码
import pandas as pd # -------------------------- 配置项,可根据实际需求修改 -------------------------- # 参考列表定义 A1 = ["x", "m", "d"] A2 = ["dd", "cc", "aa", "bb", "tt"] A3 = ["kk", "yy", "ll", "ss"] ref_lists = [A1, A2, A3] # 自动生成参考列表映射和阈值(无需手动计算阈值) ref_map = {} for idx, lst in enumerate(ref_lists, 1): # 向上取整计算50%匹配阈值:(长度 + 1) // 2 等价于 math.ceil(长度 * 0.5) threshold = (len(lst) + 1) // 2 ref_map[f"A{idx}"] = {"lst": lst, "threshold": threshold} # 替换为你自己的待处理DataFrame df = pd.DataFrame({ "x": [1, 2, 3, 4], "y": ["x,m,d,aa", "dd,cc,aa,bb,xx", "kk,yy,zz,x,m", "a,b,c"], "z": ["val1", "val2", "val3", "val4"] }) # --------------------------------------------------------------------------- # 1. 拆分y列逗号分隔值为集合,方便匹配统计 df["y_set"] = df["y"].str.split(",").apply(set) # 2. 逐行匹配所有参考列表,返回符合阈值的匹配元素列表 def match_rule(row): matched_res = [] for info in ref_map.values(): match_count = len(row["y_set"] & set(info["lst"])) if match_count >= info["threshold"]: # 收集匹配到的元素,按逗号拼接存储 matched_items = ",".join(row["y_set"] & set(info["lst"])) matched_res.append(matched_items) return matched_res if matched_res else None df["matched_y"] = df.apply(match_rule, axis=1) # 3. 过滤无匹配行,拆分多匹配结果为独立行 result = df.dropna(subset=["matched_y"]).explode("matched_y") # 4. 整理输出列,重命名匹配后的y列 result = result[["x", "matched_y", "z"]].rename(columns={"matched_y": "y"}).reset_index(drop=True) print(result)
输出示例
以上示例代码的运行结果如下:
x y z 0 1 x,m,d val1 1 2 dd,cc,aa,bb val2 2 3 x,m val3 3 3 kk,yy val3
内容的提问来源于stack exchange,提问作者user16600616
相关产品推荐
相关产品推荐

