如何将Pandas DataFrame每行二进制值转换为十进制整数Series?
嘿,我来帮你搞定这个二进制转十进制的问题!当你处理百万级(1e6行)的数据集时,用字符串拼接再转换的方法确实会有点拖慢速度,尤其是列数多的时候。这里给你几个更高效的方案,针对你n=5的固定列场景,速度提升特别明显:
方法一:数值矩阵乘法(最快首选)
这个方法完全避开字符串操作,直接利用二进制位的权重进行数值计算,速度快到离谱。思路是给每一列分配对应的2的幂次权重,然后让DataFrame和权重做矩阵乘法:
import pandas as pd import numpy as np # 生成你的测试数据 m = int(1e6) n = 5 df = pd.DataFrame(np.random.rand(m,n)).round().astype(int) # 定义每列的权重:假设每行从左到右是二进制的高位到低位(比如第一列是2^4,最后一列是2^0) weights = 2 ** np.arange(n-1, -1, -1) # 计算每行对应的十进制数,返回Series decimal_series = df.dot(weights)
举个例子,如果某行是[1,0,1,0,1],对应的权重是[16,8,4,2,1],相乘求和就是16+4+1=21,完全符合二进制转十进制的逻辑。这个方法跑1e6行数据几乎瞬间完成,比字符串方法快几十倍都不止。
方法二:优化版字符串拼接(适合必须用字符串的场景)
如果你一定要保留字符串处理的思路,可以用agg结合''.join代替原来的sum,效率会比原方法高不少:
decimal_series = df.astype(str).agg(''.join, axis=1).apply(lambda x: int(x, 2))
不过还是那句话,这个方法的速度远不如数值计算,大数据量下不推荐。
方法三:Numpy位运算实现
用Numpy的位或和左移操作,也能高效完成转换,逻辑和方法一类似:
arr = df.to_numpy() decimal_arr = np.zeros(m, dtype=int) for i in range(n): # 把当前列的0/1左移对应位数,然后合并到结果里 decimal_arr |= arr[:, i] << (n-1 - i) decimal_series = pd.Series(decimal_arr)
这个方法的速度和方法一接近,也是纯数值运算,适合喜欢用底层位操作的同学。
总结一下:优先选方法一,代码简洁还超快,完全适配你的百万级数据集需求。
内容的提问来源于stack exchange,提问作者Jacobo Lansac
相关产品推荐
相关产品推荐

