Pandas如何删除指定列的列表值中包含特定字符串的行
问题原因分析
你原来的代码存在三个核心错误,导致无法正常运行:
for row in df迭代得到的是DataFrame的列名,不是行索引/行数据,df.drop(row)实际在尝试删除列,和需求完全不符- 遍历DataFrame的过程中直接删除行,会导致索引动态偏移,出现漏删、错删的情况
- 三层嵌套循环时间复杂度极高,完全不符合pandas矢量化操作的设计逻辑,数据量稍大就会出现性能问题
正确实现方案
用pandas的布尔索引+自定义判断逻辑,一行代码即可完成需求:
# 筛选出prescript列的列表中不存在包含"complementary"元素的行 df = df[~df['prescript'].apply(lambda x: any("complementary" in element for element in x))]
代码说明
df['prescript'].apply(lambda x: ...)对prescript列的每个列表值做自定义判断any("complementary" in element for element in x)只要列表中任意元素包含目标字符串就返回True~是布尔取反运算符,也就是我们要保留判断结果为False的行(即列表中没有目标字符串的行)- 最终用布尔索引筛选符合条件的行赋值给df即可
如果追求更高的执行效率,也可以用列表推导式替代apply,处理大数据量时速度更快:
mask = [not any("complementary" in e for e in lst) for lst in df["prescript"]] df = df[mask]
测试验证
你可以用下面的测试用例验证效果:
import pandas as pd # 构造测试数据 df = pd.DataFrame({ "id": [1, 2, 3], "prescript": [ ["常规处方", "complementary附加处方", "其他"], ["常规处方A", "常规处方B"], ["complementary特需处方"] ] }) # 执行筛选 df = df[~df['prescript'].apply(lambda x: any("complementary" in element for element in x))] print(df)
执行后只会保留id为2的行,符合需求。
内容的提问来源于stack exchange,提问作者Gabrielle
相关产品推荐
相关产品推荐

