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

如何在Pandas中高效存储二进制列?需统计每行1的数量

问题描述

我正在处理一个大型数据集,其中Genotype列被Pandas识别为object类型,数据示例如下:

GenotypeIteration
100101100110111011010110000100111110111110000001110010011011111111011011110010110
000111000010110100000001100100101001011010110010101011101101110001010001100000000
001001001001001010001001011001101001011100001001110000000110010110011011110000110
100010101011000001011100010111110001101011001010101111001100110111010100111111100
110101010100100011101001101100010010101010011110001110111101101011010101000111100

我想找一种合适的数据类型,把这列当作二进制数据存储以降低存储成本。我的需求是统计每行中1的数量,因此以下转成整数的方法并不适用:

df["Genotype"] = [int(x,2) for x in df["Genotype"]]
解决方案

1. 直接统计(无需转换类型)

如果核心需求只是统计1的数量,不需要修改原列存储类型,直接用字符串的count方法即可,操作简单且性能出色:

df['count_ones'] = df['Genotype'].str.count('1')

2. 转换为二进制专用类型优化存储

若确实需要压缩存储,可选择以下方式:

  • Numpy无符号整数类型:先确认二进制字符串的长度,选择足够容纳的无符号整数类型(比如80位长度用uint128),转换后存储:

    import numpy as np
    df['Genotype'] = df['Genotype'].apply(lambda x: np.uint128(int(x, 2)))
    

    统计1的数量时用位运算:

    df['count_ones'] = df['Genotype'].apply(lambda x: bin(x).count('1'))
    

    注意:字符串长度不能超过所选整数类型的最大位数,否则会溢出。

  • Pandas布尔数组:固定长度的二进制字符串可转为布尔数组(True代表1,False代表0),存储效率远高于object类型:

    from pandas.core.arrays import BooleanArray
    import numpy as np
    
    def str_to_bool_array(s):
        bool_arr = np.array([c == '1' for c in s], dtype=bool)
        return BooleanArray(bool_arr)
    
    df['Genotype'] = df['Genotype'].apply(str_to_bool_array)
    

    统计数量直接求和:

    df['count_ones'] = df['Genotype'].apply(lambda x: x.sum())
    

3. 超高效存储:BitArray

针对超长二进制字符串,推荐使用bitarray库,每个二进制位仅占1比特,存储成本极低:

from bitarray import bitarray

df['Genotype'] = df['Genotype'].apply(lambda x: bitarray(x))
df['count_ones'] = df['Genotype'].apply(lambda x: x.count())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:53:11