Python pandas实现多列正负值转换为单列二进制字符串值
实现方案
直接通过pandas向量化操作即可完成需求,不需要额外循环或拆分多列,核心逻辑是逐元素判断正负后按行拼接字符串。
推荐写法(高性能,适配大数据量)
这是性能最优的实现,全程使用pandas底层向量化运算,比行遍历写法快数十倍:
import pandas as pd # 构造示例数据 data = { "te1_pl": [-10,-7,47,1,9,-18,], "te2_pl": [-32,69,16,18,36,4.3,], "te3_pl": [305.3,-14,-38,37,47,16.5,], "te4_pl": [-69,41,-9,0,-33,28.1,], "te5_pl": [-44,41,82,42,6,-9.9,],} df = pd.DataFrame(data) # 生成二进制列 df["bin"] = (df > 0).astype(int).astype(str).agg("".join, axis=1)
代码逻辑拆解:
df > 0:逐元素判断数值是否大于0,返回同形状的布尔矩阵,符合规则的值为True,否则为False.astype(int):将布尔值转换为整数,True转为1,False转为0.astype(str):将整数转为字符串类型,为后续拼接做准备.agg("".join, axis=1):按行将所有0/1字符串拼接为完整的二进制串
如果不需要用全部列计算,可以先筛选目标列再运算,比如只选择名称以_pl结尾的列:
# 筛选指定列参与计算 target_cols = [c for c in df.columns if c.endswith("_pl")] df["bin"] = (df[target_cols] > 0).astype(int).astype(str).agg("".join, axis=1)
简易写法(适配小数据量)
如果数据量不大(小于10万行),也可以用apply行遍历实现,写法更直观易读:
def convert_bin(row): return "".join("1" if val > 0 else "0" for val in row) df["bin"] = df.apply(convert_bin, axis=1)
结果验证
两种写法运行后得到的结果完全匹配预期:
| te1_pl | te2_pl | te3_pl | te4_pl | te5_pl | bin |
|---|---|---|---|---|---|
| -10 | -32 | 305.3 | -69 | -44 | 00100 |
| -7 | 69 | -14 | 41 | 41 | 01011 |
| 47 | 16 | -38 | -9 | 82 | 11001 |
| 1 | 18 | 37 | 0 | 42 | 11101 |
| 9 | 36 | 47 | -33 | 6 | 11101 |
| -18 | 4.3 | 16.5 | 28.1 | -9.9 | 01110 |
注意:实现严格遵循规则,数值等于0时会标记为0,和需求完全一致。
内容的提问来源于stack exchange,提问作者ManOnTheMoon
相关产品推荐
相关产品推荐

