Pandas实现:统计列表元素在列每行的匹配次数并新增列
问题描述
现有如下pandas DataFrame:
MEMBERSHIP [2022_K_, EWREW_NK] [333_NFK_,2022_K_, EWREW_NK, 000]
同时有一个关键词列表:
list_k = ["_K_","_NK_","_NKF_","_KF_"]
需要新增一列COUNT,统计MEMBERSHIP列每行中包含上述关键词的元素数量,期望输出如下:
MEMBERSHIP | COUNT [2022_K_, EWREW_NK] | 2 [333_NFK_,2022_K_, EWREW_NK, 000] | 3
解决方案
以下是两种可行的实现方式:
方法一:自定义函数结合apply
先编写一个统计单条列表中匹配元素数量的函数,再对MEMBERSHIP列应用该函数:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ "MEMBERSHIP": [ ["2022_K_", "EWREW_NK"], ["333_NFK_", "2022_K_", "EWREW_NK", "000"] ] }) list_k = ["_K_","_NK_","_NKF_","_KF_"] def count_matching_items(items): count = 0 for item in items: # 判断当前元素是否包含任意一个目标关键词 if any(keyword in item for keyword in list_k): count += 1 return count # 新增COUNT列 df["COUNT"] = df["MEMBERSHIP"].apply(count_matching_items) print(df)
执行后输出结果:
MEMBERSHIP COUNT 0 [2022_K_, EWREW_NK] 2 1 [333_NFK_, 2022_K_, EWREW_NK, 000] 3
方法二:向量化操作(适合大数据量)
通过explode展开列表元素,结合正则匹配关键词,最后按原行索引聚合统计,效率更高:
import pandas as pd df = pd.DataFrame({ "MEMBERSHIP": [ ["2022_K_", "EWREW_NK"], ["333_NFK_", "2022_K_", "EWREW_NK", "000"] ] }) list_k = ["_K_","_NK_","_NKF_","_KF_"] # 将关键词拼接为正则匹配模式 match_pattern = '|'.join(list_k) # 展开列表、匹配关键词、按原索引求和计数 df["COUNT"] = df["MEMBERSHIP"].explode().str.contains(match_pattern, regex=True).groupby(level=0).sum() print(df)
这种方式避免了逐行循环,在处理大规模数据时性能更优。
内容的提问来源于stack exchange,提问作者coelidonum
相关产品推荐
相关产品推荐

