如何在Pandas中高效存储二进制列?需统计每行1的数量
问题描述
我正在处理一个大型数据集,其中Genotype列被Pandas识别为object类型,数据示例如下:
| Genotype | Iteration |
|---|---|
| 10010110011011101101011000010011111011111000000111001001101111111101101111001011 | 0 |
| 00011100001011010000000110010010100101101011001010101110110111000101000110000000 | 0 |
| 00100100100100101000100101100110100101110000100111000000011001011001101111000011 | 0 |
| 10001010101100000101110001011111000110101100101010111100110011011101010011111110 | 0 |
| 11010101010010001110100110110001001010101001111000111011110110101101010100011110 | 0 |
我想找一种合适的数据类型,把这列当作二进制数据存储以降低存储成本。我的需求是统计每行中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
相关产品推荐
相关产品推荐

