如何在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
相关产品推荐
相关产品推荐

