如何基于指定列表查找并删除Pandas DataFrame中的行?
Pandas新手求助:如何基于列表删除DataFrame中的对应行
原始DataFrame:
name stuff floats ints 0 Mike a 1.0 1 1 Joey d 2.2 3 2 Zendaya c NaN 8 3 John a 1.0 1 4 Abruzzi d NaN 3
待删除列表to_delete:
[['Abruzzi', 'd', pd.NA, 3], ['Mike', 'a', 1.0, 1]]
期望得到的结果DataFrame:
name stuff floats ints 1 Joey d 2.2 3 2 Zendaya c NaN 8 3 John a 1.0 1
请问适合用Pandas的哪种方法实现这个需求?
推荐方法:merge+indicator参数(处理NaN更可靠)
你的待删除行里包含空值pd.NA,而Pandas里NaN和任何值(包括自己)都不相等,直接用简单匹配方法会出错,所以最稳妥的是用合并筛选的思路:
步骤拆解
- 把原始数据和待删除列表整理成DataFrame:
import pandas as pd # 原始DataFrame df = pd.DataFrame({ 'name': ['Mike', 'Joey', 'Zendaya', 'John', 'Abruzzi'], 'stuff': ['a', 'd', 'c', 'a', 'd'], 'floats': [1.0, 2.2, pd.NA, 1.0, pd.NA], 'ints': [1, 3, 8, 1, 3] }) # 待删除列表转成DataFrame,列名和原始df一致 to_delete = [['Abruzzi', 'd', pd.NA, 3], ['Mike', 'a', 1.0, 1]] delete_df = pd.DataFrame(to_delete, columns=df.columns)
- 用
merge做左连接,通过indicator标记行的来源:
# 左连接后,_merge列会标记行是只在原始df有(left_only),还是两边都有(both) merged = df.merge(delete_df, how='left', indicator=True) # 只保留原始df独有的行,也就是不需要删除的行 result = merged[merged['_merge'] == 'left_only'].drop(columns='_merge')
运行后就能得到目标结果,这个方法完美适配包含空值的场景。
补充:无空值场景的简化方法
如果待删除的行里没有空值,也可以用isin快速筛选,但你的数据有NaN,别用这个:
# 生成每行是否在待删除列表里的掩码,取反就是要保留的行 mask = ~df.apply(tuple, axis=1).isin([tuple(row) for row in to_delete]) result = df[mask]
但因为NaN的存在,这个方法会漏判包含NaN的待删除行,所以优先用merge的方法。
内容的提问来源于stack exchange,提问作者BlackHaikal
相关产品推荐
相关产品推荐

