如何用Pandas风格方法筛选列表列含共同值的行
Pandorable方法筛选包含指定值的列表行
嗨,我来帮你搞定这个问题!你想要摆脱for循环,用更贴合Pandas风格的方式筛选出那些列表里包含共同值1的行,这就给你几个实用方案:
方法一:简洁直观的apply检查
这个方法直接对Series进行元素级检查,代码短且容易理解,适合中小数据量:
import pandas as pd # 你的原始数据生成 df = pd.DataFrame( {'a':['A','A','B','B','B','C'], 'b':[1,2,5,1,4,6]}) d = df.groupby('a')['b'].apply(list) # 目标值 target = 1 # 生成布尔掩码:检查每个列表是否包含目标值 mask = d.apply(lambda x: target in x) # 筛选结果 result = d[mask] print(result)
输出结果:
A [1, 2] B [5, 1, 4] Name: b, dtype: object
方法二:高效向量化的展开分组法
如果你的数据量较大,apply可能效率不够,这个方法利用Pandas的向量化操作,避免逐元素遍历:
import pandas as pd df = pd.DataFrame( {'a':['A','A','B','B','B','C'], 'b':[1,2,5,1,4,6]}) d = df.groupby('a')['b'].apply(list) target = 1 # 将列表展开为多行,保留原索引 expanded = d.explode() # 筛选出等于目标值的行,再按原索引分组判断是否存在目标值 has_target = expanded[expanded == target].groupby(level=0).any() # 筛选结果 result = d[has_target] print(result)
这个方法通过explode把列表拆成单个元素,再利用分组和any()来判断每个分组是否包含目标值,性能比逐列表检查更好。
额外小技巧:如果要找多个共同值的交集
要是你以后需要筛选出同时包含多个值的行,比如既包含1又包含2的,只需要稍微修改apply的逻辑:
targets = {1, 2} mask = d.apply(lambda x: targets.issubset(set(x))) result = d[mask]
这样就能精准筛选出包含所有指定值的行啦!
内容的提问来源于stack exchange,提问作者Prodiction
相关产品推荐
相关产品推荐

