You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中保留含缺失值的行(链式调用实现)

保留含缺失值的行(与dropna相反)的Pandas链式实现方法

嘿,刚好碰到过类似需求!你想要的是保留任意列包含空值的行,这确实和dropna()默认的“删掉含空值的行”完全相反,而且还想用链式调用的风格,对吧?

先看你的示例数据,先把代码和原始DataFrame列出来:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': [1,2], 'b': [np.nan, 4]})

原始df的内容是:

a    b
0  1  NaN
1  2  4.0

这里得提一句:你写的“期望结果”好像搞反啦——要保留含空值的行的话,应该是第0行,而不是第1行(第1行没有缺失值,是dropna()会保留的行)。下面我按正确的需求(保留含空值的行)给你几种链式调用的实现方式:

方法一:用loc结合lambda(最推荐的链式写法)

这完全符合你想要的df.loc[lambda x: ...]风格,逻辑清晰又简洁:

# 链式调用筛选出任意列含空值的行
result = df.loc[lambda x: x.isna().any(axis=1)]
print(result)

输出结果:

a    b
0  1  NaN

原理解释:

  • x.isna():把DataFrame里的空值转换成True,非空值转换成False,生成一个布尔型的DataFrame。
  • .any(axis=1):按行检查,只要该行有至少一个True(也就是有缺失值),就返回True,最终得到一个布尔Series。
  • loc[布尔Series]:选中所有返回True的行,也就是保留含空值的行。

方法二:用pipe封装筛选逻辑

如果你觉得loc里的lambda有点长,也可以用pipe来封装,同样是链式调用:

result = df.pipe(lambda df: df[df.isna().any(axis=1)])

方法三:模拟keepna()方法的写法

你提到想写df.keepna(how='any')这种风格,虽然Pandas原生没有这个方法,但我们可以临时给DataFrame加个自定义方法(注意:不建议全局修改Pandas类,避免冲突,仅在当前脚本里用用就行):

# 给DataFrame临时添加keepna方法
pd.DataFrame.keepna = lambda self, how='any': (
    self.loc[self.isna().any(axis=1)] if how == 'any' 
    else self.loc[self.isna().all(axis=1)]
)

# 现在就可以像理想写法一样调用啦
result = df.keepna(how='any')

这个方法还支持how='all',也就是只保留所有列都为空值的行,和dropna(how='all')相反。

内容的提问来源于stack exchange,提问作者Hatshepsut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:06:35