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

