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

scRNAseq分析比较基因表达量报错:无序Categoricals仅支持相等比较

报错根因
  • 核心触发点是大小比较操作覆盖了非数值类型的leiden列:leiden是scanpy聚类默认生成的无序Categorical(分类)类型列,pandas对无序分类列仅支持相等/不相等判断,不支持>/<这类大小比较逻辑。
  • 多余的align操作直接触发报错:你生成的mean_expression本身只包含6个标记基因的全局均值,索引和df里的基因列完全匹配,根本不需要对齐。调用df.align(mean_expression, axis=1, copy=False)后,会为mean_expression补出不存在的leiden索引(值为NaN),导致后续df > mean_expression会对df所有列(包括leiden分类列)执行大小比较,直接抛出类型错误。
修复方案

直接删除多余的align代码行,仅对数值型的基因表达列执行阳性判断,再拼接回分组列做聚合即可,修正后可运行的完整代码如下:

markers = ["MS4A1", "CD72", "CD37", "CD79A", "CD79B","CD19"]
grouping_column = "leiden"
df = sc.get.obs_df(hy_bc, markers + [grouping_column])
# 直接指定基因列计算全局均值,避免列筛选逻辑出问题
mean_expression = df.loc[:, markers].mean(axis=0)

# 仅对基因列做阳性判断,不触碰分组列
pos_df = df[markers].gt(mean_expression)
pos_df[grouping_column] = df[grouping_column] # 补充分组列用于分组统计

g = pos_df.groupby(grouping_column)
frac = lambda z: sum(z) / z.shape[0]
frac.__name__ = "pos_frac"
# 得到各聚类的阳性细胞数、阳性占比统计结果
pos_stat = g.aggregate([sum, frac])

# 如果需要同步统计各聚类的基因平均表达,加这行即可
cluster_mean_exp = df.groupby(grouping_column)[markers].mean()

注:.gt()是pandas DataFrame的大于方法,等价于>,但对数值列的类型兼容性更好,不会出现隐式类型转换问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:09:18