如何在Pandas中对含列表的列应用条件生成新列?
在Pandas中基于列表列的条件创建新列
问题场景
现有如下Pandas DataFrame,其中BRAND列的每个元素都是列表(可能为空、单个或多个元素):
import pandas as pd df = pd.DataFrame( { "ID": [1, 2, 3, 4, 5], "BRAND": [[], ["LVH"], ["FER", "MER", "POR"], ["WDC", "AUD", "LVH"], ["AST"]] } )
需要根据目标列表target_list = ["LVH", "WDC"]创建新列FLAG:若BRAND的列表中包含目标列表的至少一个元素,标记为Y,否则标记为N,最终得到如下结果:
ID BRAND FLAG 0 1 [] N 1 2 [LVH] Y 2 3 [FER, MER, POR] N 3 4 [WDC, AUD, LVH] Y 4 5 [AST] N
解决方案
这里提供几种高效的实现方式:
方法1:集合交集 + 列表推导式(推荐,大数据量下效率最高)
利用集合的快速查找特性,判断每个BRAND列表与目标集合是否存在交集:
target_set = set(target_list) df["FLAG"] = ["Y" if target_set.intersection(brand) else "N" for brand in df["BRAND"]]
集合的交集操作时间复杂度远低于列表遍历,数据量越大,这种方法的优势越明显。
方法2:Pandas原生 explode + 分组聚合
通过explode拆分列表为多行,再分组判断每组是否存在目标元素:
df["FLAG"] = df.explode("BRAND")["BRAND"].isin(target_list).groupby(level=0).any().map({True: "Y", False: "N"})
这种方法完全基于Pandas的向量化操作,适合习惯使用Pandas原生API的场景。
方法3:apply 匿名函数(代码简洁,小数据量适用)
用apply遍历每个列表,判断是否有目标元素:
df["FLAG"] = df["BRAND"].apply(lambda x: "Y" if any(item in target_list for item in x) else "N")
代码直观易懂,但apply本质是逐行遍历,大数据量下性能不如前两种方法。
内容的提问来源于stack exchange,提问作者glpsx
相关产品推荐
相关产品推荐

