如何在Python Pandas中拼接二进制列?列数超12时遇异常
问题分析与解决方案
你遇到的这个奇怪负数结果,本质是整数溢出导致的!
为什么会出现 -2147483648?
你的代码里多了一步完全没必要的操作:把拼接好的字符串转成整数再转回字符串。当列数超过12时,拼接后的字符串是13位(比如"0010000000000"),把它当作十进制数转成int时,pandas默认会使用numpy的int32类型——而int32的最大值只有2147483647(约20亿),但13位的十进制数100000000000远远超出了这个范围,溢出后就变成了int32能表示的最小值-2147483648。
解决方法:直接操作字符串,跳过整数转换
我们的目标是生成二进制签名字符串,完全不需要绕到整数这一步,直接拼接就行:
最简实现
df['new'] = df.astype(str).sum(axis=1)
因为你的所有列值都是0或1,转成字符串后拼接出来的长度正好等于列数,直接就能得到你想要的固定长度二进制字符串(比如13列时就是"0010000000000")。
稳妥补零版(可选)
如果担心某些极端情况(比如列值意外不是0/1导致长度不足),可以用str.zfill()强制补前导零,保证长度等于列数:
col_num = df.shape[1] df['new'] = df.astype(str).sum(axis=1).str.zfill(col_num)
高效版(适合超大DataFrame)
如果你的数据量很大,字符串拼接的效率可以再优化,用numpy的向量操作来处理:
import numpy as np df['new'] = np.apply_along_axis(lambda row: ''.join(row.astype(str)), axis=1, arr=df.values)
测试验证
用你13列的例子测试:
a = np.zeros(shape=(3,13)) df = pd.DataFrame(a).astype(int) df[2] = 1 df['new'] = df.astype(str).sum(axis=1) print(df['new'])
输出结果完全符合预期:
0 0010000000000 1 0010000000000 2 0010000000000 Name: new, dtype: object
内容的提问来源于stack exchange,提问作者njfrazie
相关产品推荐
相关产品推荐

