Python中查找DataFrame空列并提取为列表及isna报错排查
问题1:如何在Python中查找DataFrame中的空列,并将它们提取为列表?
首先得明确下你说的“空列”是哪种情况——是整列所有值都是NaN,还是只要包含至少一个NaN就算?我两种场景都给你整理了实现方式:
场景1:提取所有值都是NaN的空列
可以结合isna()和all()方法定位全空列,再把列名转成列表:
import pandas as pd # 示例DataFrame df = pd.DataFrame({ 'col1': [1, 2, 3], 'col2': [pd.NA, pd.NA, pd.NA], 'col3': [None, 5, None], 'col4': [pd.NA, pd.NA, pd.NA] }) # 筛选全空列并转成列表 empty_cols = [col for col in df.columns if df[col].isna().all()] print(empty_cols) # 输出: ['col2', 'col4']
场景2:提取包含至少一个NaN值的列
把上面的all()换成any()就能实现:
cols_with_nan = [col for col in df.columns if df[col].isna().any()] print(cols_with_nan) # 输出: ['col2', 'col3', 'col4']
问题2:为什么使用
df.isna().any()会报错AttributeError: 'DataFrame' object has no attribute 'isna'? 这个坑很多老版本pandas用户都踩过!原因很简单:你的pandas版本太低了。isna()方法是在pandas 0.21.0版本才正式引入的,如果你用的是更早的版本,自然会提示这个属性不存在。
给你两个解决办法:
- 方案一(推荐):升级pandas版本
在终端执行这条命令就行:pip install --upgrade pandas - 方案二:用旧版本替代方法
isnull()
旧版本里isnull()和新版本isna()的功能完全一致,把代码改成这样就能正常运行:df.isnull().any()
你可以先查下自己的pandas版本确认下:
print(pd.__version__)
如果版本号小于0.21.0,就按上面的方法调整吧~
内容的提问来源于stack exchange,提问作者user9238790




