Pandas如何基于指定列删除含空值的行
Pandas如何基于指定列删除含空值的行
嗨,我来帮你搞定这个问题!先还原一下你给出的示例数据:
| A | B |
|---|---|
| Cell 1 | np.nan |
| Cell 2 | np.nan |
| np.nan | Cell 3 |
| Cell 4 | Cell 4 |
你想删除B列包含np.nan的行,先说说你写的两段代码存在的问题:
- 代码#1:
df = df[df['B'] != np.nan],这个写法完全无效。因为np.nan有个特殊性质——它不等于任何值,包括它自己,所以df['B'] != np.nan会返回全False的布尔序列,最后得到的是空DataFrame。 - 代码#2:这段代码没写完,逻辑不完整,没法正确实现删除操作。
接下来给你两种靠谱的解决方案:
方法一:用dropna()(推荐,最简洁直观)
这是Pandas专门用来删除空值行/列的方法,指定subset参数就能只针对某一列判断空值:
import pandas as pd import numpy as np # 先构造示例数据 data = {'A': ['Cell 1', 'Cell 2', np.nan, 'Cell 4'], 'B': [np.nan, np.nan, 'Cell 3', 'Cell 4']} df = pd.DataFrame(data) # 删除B列含空值的行 df = df.dropna(subset=['B'])
执行后得到的结果就是B列无空值的行:
| A | B |
|---|---|
| np.nan | Cell 3 |
| Cell 4 | Cell 4 |
方法二:用notna()过滤行
notna()会返回布尔序列,标记每行是否为非空值,用它来索引DataFrame就能保留符合条件的行:
df = df[df['B'].notna()]
这个方法和dropna的效果完全一致,你可以根据自己的习惯选择。
总结一下:处理Pandas里的空值,一定要用专门的isna()/notna()函数或者dropna()方法,别直接用==或!=和np.nan比较,不然很容易踩坑哦~
备注:内容来源于stack exchange,提问作者Task




