如何将numpy分箱输出的列名匹配转换为可读命名?
解决Numpy分箱列名的精准匹配问题
你的问题根源在于浮点数精度误差导致字符串匹配失效——分箱输出的列名里,数值因为浮点运算出现了微小偏差(比如-0.6变成-0.6000000000000005),靠截取子串的字符串匹配很容易遗漏或错误匹配。
正确的思路应该是:跳过字符串匹配,直接解析列名中的数值,然后和你定义的原始bins列表做近似数值匹配,这样就能精准对应到期望的列名。
完整解决方案代码
import numpy as np import re # 原始分箱边界和期望列名 bins_2_bin = [-6. , -5.4, -4.8, -4.2, -3.6, -3. , -2.4, -1.8, -1.2, -0.6, 0. , 0.6, 1.2, 1.8, 2.4, 3. , 3.6, 4.2, 4.8, 5.4, 6. ] desired_names = ['-6.0:-5.4', '-5.4:-4.8', '-4.8:-4.2', '-4.2:-3.6', '-3.6:-3.0', '-3.0:-2.4', '-2.4:-1.8', '-1.8:-1.2', '-1.2:-0.6', '-0.6:0.0', '0.0:0.6', '0.6:1.2', '1.2:1.8', '1.8:2.4', '2.4:3.0', '3.0:3.6', '3.6:4.2', '4.2:4.8', '4.8:5.4', '5.4:6.0'] output_column_names = ['[-0.6000000000000005-0.0]', '[-1.2000000000000002--0.6000000000000005]', '[-1.7999999999999998--1.2000000000000002]', '[-2.4000000000000004--1.7999999999999998]', '[-3.0--2.4000000000000004]', '[-3.6--3.0]', '[-4.2--3.6]', '[-4.8--4.2]', '[-5.4--4.8]', '[-6.0--5.4]', '[0.0-0.5999999999999996]', '[0.5999999999999996-1.1999999999999993]', '[1.1999999999999993-1.7999999999999998]', '[1.7999999999999998-2.4000000000000004]', '[2.4000000000000004-3.0]', '[3.0-3.5999999999999996]', '[3.5999999999999996-4.199999999999999]', '[4.199999999999999-4.799999999999999]', '[4.799999999999999-5.4]', '[5.4-6.0]'] # 第一步:解析分箱列名中的上下界数值 def parse_bin_bounds(bin_str): # 用正则提取所有数字(包括负数) num_strings = re.findall(r'-?\d+\.?\d*', bin_str.strip('[]')) return float(num_strings[0]), float(num_strings[1]) # 第二步:创建原始分箱区间到期望列名的映射(或直接用数组索引匹配) bins_np = np.array(bins_2_bin) name_mapping = {} for bad_name in output_column_names: lower, upper = parse_bin_bounds(bad_name) # 用numpy的isclose忽略浮点精度误差,找到匹配的原始分箱区间 match_mask = np.isclose(bins_np[:-1], lower) & np.isclose(bins_np[1:], upper) # 获取匹配的索引,对应到期望列名 match_idx = np.where(match_mask)[0][0] name_mapping[bad_name] = desired_names[match_idx] # 验证结果:所有列名都能匹配到期望名称 print(name_mapping)
关键细节说明
- 正则解析数值:不管列名里是
-还是--分隔,正则表达式都能准确提取出上下界的数值,避免了字符串分割的混乱。 - 浮点近似比较:
np.isclose()会忽略浮点数运算带来的微小精度差异(比如0.6和0.5999999999999996),确保匹配到正确的原始分箱区间。 - 数组索引匹配:直接用原始bins数组的索引对应期望列名,比遍历字典更高效,尤其是分箱数量较多时。
这个方案能100%匹配所有列名,完全解决你之前遇到的遗漏问题。
内容的提问来源于stack exchange,提问作者ak_slick
相关产品推荐
相关产品推荐

