Python逐行生成DataFrame新列报错:float与float不支持&运算
问题解决:TypeError: unsupported operand type(s) for &: 'float' and 'float'
错误根源
你代码里的条件判断误用了位运算符&,但Python中布尔逻辑与必须使用and。&是针对整数的位运算操作符,无法对浮点数执行逻辑判断,这直接触发了类型错误。另外你的a函数里存在未定义的变量tvoc,需要替换为传入的参数x。
修正后的代码
1. 修复条件判断与变量问题
把b、c、d函数里的&全部替换成and,同时修正a函数的变量错误:
def b(x): return 2.33 if x <= 56 else 2.25 if 56 < x and x <= 111 else 4.6 if 111 < x and x <= 222 else 17.76 if 222 < x and x <= 667 else 668 def c(x): return 100 if x <= 56 else 75 if 56 < x and x <= 111 else 50 if 111 < x and x <= 222 else 25 if 222 < x and x <= 667 else 0 def d(x): return 0 if x <= 56 else 57 if 56 < x and x <= 111 else 112 if 111 < x and x <= 222 else 223 if 222 < x and x <= 667 else 668 def a(x): # 替换未定义的tvoc为传入的参数x return 0 if x > 667 else (c(x) - ((x - d(x))/b(x)))
2. 修正apply调用
确保values是你DataFrame中目标列的真实列名(比如假设列名为'target_col'),调用时传入正确列名:
# 替换成你实际的列名,例如 df["A"] = df.apply(lambda x: a(x['target_col']), axis=1) df["A"] = df.apply(lambda x: a(x[values]), axis=1)
高效优化方案(可选)
apply逐行处理效率较低,大数据量场景下推荐用批量映射方案:
用numpy.vectorize批量处理
import numpy as np # 将函数转为支持批量运算的向量化函数 vec_b = np.vectorize(b) vec_c = np.vectorize(c) vec_d = np.vectorize(d) vec_a = np.vectorize(a) # 直接对整列计算,无需逐行遍历 df["A"] = vec_a(df[values])
用pd.cut区间映射(最高效)
import pandas as pd import numpy as np # 定义区间边界和对应参数值 bins = [-np.inf, 56, 111, 222, 667, np.inf] b_values = [2.33, 2.25, 4.6, 17.76, 668] c_values = [100, 75, 50, 25, 0] d_values = [0, 57, 112, 223, 668] # 批量映射得到b、c、d列 df['b'] = pd.cut(df[values], bins=bins, labels=b_values) df['c'] = pd.cut(df[values], bins=bins, labels=c_values) df['d'] = pd.cut(df[values], bins=bins, labels=d_values) # 计算A列,同时处理x>667的特殊情况 df['A'] = np.where(df[values] > 667, 0, df['c'] - ((df[values] - df['d'])/df['b'])) # 可选:删除临时生成的b、c、d列 df.drop(['b', 'c', 'd'], axis=1, inplace=True)
内容的提问来源于stack exchange,提问作者A_E_E
相关产品推荐
相关产品推荐

