Pandas 1.3.4聚合时布尔列被转为float64,如何保留原类型?
问题答复
1. 该行为是否为pandas 1.3.4的预期设计
是的,该类型转换是pandas 1.3版本迭代中的有意调整。1.3版本之前,布尔列计算中位数时会直接基于布尔底层的整数存储规则(True=1、False=0)计算,结果如果刚好是整数值会保留布尔类型;1.3版本为了统一不同数据类型的数值统计逻辑,所有非浮点型列计算中位数时都会先统一转换为float64类型再做计算,因此布尔列的计算结果会以1.0/0.0的浮点形式输出,属于版本设计的预期行为。
2. 聚合时直接保留布尔列原始类型的方法
你可以通过为不同列指定差异化聚合规则的方式,在聚合阶段直接完成类型保留,不需要事后手动转换,常用方案如下:
方案1:针对确定分组内布尔值完全一致的场景
如果同分组下bool_col的取值全部相同(和你的示例场景一致),直接取分组内任意一个布尔值即可,性能最优:
df_genes = df.groupby("gene").agg( bool_col=("bool_col", "first"), S2=("S2", "median") )
方案2:针对分组内布尔值可能不同、仍需取中位数对应布尔结果的场景
如果需要严格基于中位数的计算结果转回布尔类型,可以在布尔列的聚合函数中加入类型转换逻辑:
df_genes = df.groupby("gene").agg( bool_col=("bool_col", lambda x: bool(x.median())), S2=("S2", "median") )
注意:如果分组内True和False的数量相等,中位数计算结果为0.5,转换为布尔值时会得到True,需要根据你的业务需求调整该场景下的判断逻辑,比如可以替换为
lambda x: x.sum() >= len(x)/2自定义判断规则。
内容的提问来源于stack exchange,提问作者MaW
相关产品推荐
相关产品推荐

