Pandas:指定列值存在于另一列列表元素时删除对应行
最优实现方案(Pandas实现,适配结构化表格数据场景)
核心逻辑是先将friend列所有列表内的元素汇总为哈希集合,依托集合O(1)复杂度的成员判断能力做行筛选,整体时间复杂度为O(n),是大规模数据场景下性能最优的实现方式。
不要使用逐行遍历全表匹配的写法,这类写法时间复杂度为O(n²),数据量过万后性能会出现明显下降,预收集集合的方案性能可比逐行匹配高数十到数百倍。
实现步骤
- 加载或构造原始结构化数据集
- 平铺
friend列的所有列表值,将所有元素存入集合,得到所有出现在好友列表中的用户全集 - 筛选
user列取值不在上述集合内的行,即为最终保留的结果
可直接运行的代码示例
import pandas as pd # 构造原始示例数据 df = pd.DataFrame({ 'user': ['jack', 'mary', 'alice', 'andrew', 'catherine', 'john'], 'friend': [ ['mary', 'jane', 'alex'], ['kate', 'andrew', 'jensen'], ['marina', 'catherine', 'howard'], ['syp', 'yuslina', 'john'], ['yute', 'kelvin'], ['beyond', 'holand'] ] }) # 汇总所有好友列表的元素到集合 friend_set = set() for f_list in df['friend']: friend_set.update(f_list) # 筛选符合要求的行,reset_index可选,用来重置行序号 result = df[~df['user'].isin(friend_set)].reset_index(drop=True) print(result)
运行输出
user friend 0 jack [mary, jane, alex] 1 alice [marina, catherine, howard]
注意:如果你的
friend列存储的是字符串格式的列表(例如"[mary, jane, alex]"),需要先用ast.literal_eval将字符串转换为原生列表对象,再执行上述流程。
内容的提问来源于stack exchange,提问作者nerd
相关产品推荐
相关产品推荐

