如何在pandas中将整数掩码按位编码为二进制虚拟变量
把整数掩码转成二进制特征列的几种方法
没问题,这事儿我经常碰到!下面给你分享几个实用的批量处理方法,轻松把pandas DataFrame里的整数掩码转成对应的二进制特征列——就像你说的,十进制11(4位二进制1011)生成4列值为1、0、1、1的特征。
方法1:字符串处理法(直观易懂)
这个方法用字符串操作把整数转成固定长度的二进制字符串,再拆分每一位成单独列,适合小数据集或者需要快速验证的场景:
import pandas as pd # 示例DataFrame df = pd.DataFrame({'mask': [11, 3, 7, 0, 15]}) num_bits = 4 # 指定要转换的二进制位数 # 步骤:转二进制字符串→补前导零→拆分每一位 binary_features = df['mask'].apply(lambda x: bin(x)[2:].zfill(num_bits)).str.extractall('(.)').unstack() # 给新列重命名,从高位到低位命名(比如bit_3对应2^3位) binary_features.columns = [f'bit_{i}' for i in range(num_bits-1, -1, -1)] # 合并回原DataFrame df = pd.concat([df, binary_features], axis=1)
运行后你会得到如下结果:
| mask | bit_3 | bit_2 | bit_1 | bit_0 |
|---|---|---|---|---|
| 11 | 1 | 0 | 1 | 1 |
| 3 | 0 | 0 | 1 | 1 |
| 7 | 0 | 1 | 1 | 1 |
| 0 | 0 | 0 | 0 | 0 |
| 15 | 1 | 1 | 1 | 1 |
方法2:位运算(高效快捷,适合大数据集)
如果你的数据集很大,字符串处理可能有点慢,这时候用位运算直接操作数值就爽多了,完全没有字符串转换的开销,速度拉满:
import pandas as pd df = pd.DataFrame({'mask': [11, 3, 7, 0, 15]}) num_bits = 4 # 生成每一位对应的掩码(比如4位就是8、4、2、1,对应2^3到2^0) bit_masks = [2**i for i in range(num_bits-1, -1, -1)] # 循环处理每一位:位与运算→右移到最低位,得到0或1 for idx, mask_val in enumerate(bit_masks): bit_pos = num_bits - 1 - idx df[f'bit_{bit_pos}'] = (df['mask'] & mask_val) >> bit_pos
百万级数据量用这个方法也能轻松跑通,性能比字符串处理好很多。
方法3:numpy向量化操作(极致高效)
用numpy的unpackbits函数做向量化处理,也是大数据场景的绝佳选择。注意这个方法默认处理uint8类型,如果你需要超过8位的二进制特征,只需调整数据类型即可:
import pandas as pd import numpy as np df = pd.DataFrame({'mask': [11, 3, 7, 0, 15]}) num_bits = 4 # 把整数转成uint8数组→拆分成8位二进制→取最后num_bits位(我们需要的部分) binary_array = np.unpackbits(df['mask'].values.astype(np.uint8), axis=0).reshape(-1, 8)[:, -num_bits:] # 转成DataFrame并命名列 binary_df = pd.DataFrame(binary_array, columns=[f'bit_{i}' for i in range(num_bits-1, -1, -1)], index=df.index) # 合并回原DataFrame df = pd.concat([df, binary_df], axis=1)
这个方法利用numpy的底层优化,速度比纯pandas操作更快,适合超大规模数据集的批量处理。
内容的提问来源于stack exchange,提问作者Boycott OpenAI sellouts
相关产品推荐
相关产品推荐

