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

如何在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)

运行后你会得到如下结果:

maskbit_3bit_2bit_1bit_0
111011
30011
70111
00000
151111

方法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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:04:58