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

如何从AnnData对象中过滤去除NaN值?

解决AnnData对象中过滤cell_type列NaN值的问题

错误原因分析

你之前尝试的方法无效,核心原因是:

  • adata.obs['cell_type'] != 'NaN':这里把字符串'NaN'当成了缺失值,但实际数据中的缺失值是numpy的NaN,两者不匹配,无法过滤。
  • adata.obs['cell_type'] != np.nan:NaN的特性是和任何值(包括自身)比较结果都是False,所以这个条件永远不成立,无法筛选掉NaN。
  • scATAC_adata_raw.obs.dropna(how="any"):该方法仅返回过滤后的obs DataFrame,没有同步更新AnnData对象的其他部分(如表达矩阵X、var等),且未赋值回原对象,所以不会生效。

正确解决方案

结合你需要过滤leukocytes和NaN的需求,以下两种方法最直接有效:

方法1:布尔索引结合pd.notna()

使用pandas的notna()函数识别非缺失值,同时与过滤leukocytes的条件结合:

import pandas as pd

# 同时过滤cell_type为leukocytes和NaN的细胞
adata = adata[(adata.obs['cell_type'] != 'leukocytes') & pd.notna(adata.obs['cell_type'])]

方法2:使用AnnData的query()方法(更简洁)

利用query方法直接写筛选逻辑,语法更直观:

adata = adata.query("cell_type != 'leukocytes' and not cell_type.isna()")

单独过滤NaN的方法(若不需要过滤leukocytes)

如果仅需要去除NaN值,可直接用:

adata = adata[pd.notna(adata.obs['cell_type'])]

补充:正确使用dropna的方式

如果一定要用dropna,需要基于过滤后的索引更新整个AnnData对象:

# 获取cell_type列无缺失值的样本索引
valid_cells = adata.obs.dropna(subset=['cell_type']).index
# 过滤AnnData,同时排除leukocytes
adata = adata[(adata.obs['cell_type'] != 'leukocytes') & adata.obs.index.isin(valid_cells)]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:30:02