Python使用另一DataFrame的区间值为目标DataFrame打分类标签报错如何解决
问题原因
- 列名拼写错误:df2的起始列名是
Begin,你的代码中混淆使用了start、小写begin,同时最后赋值时错误把df1写为d1,都会引发异常。 - 比较逻辑错误:你用单个数值
row['A']和整个df2['Begin']列(Series类型,包含4个值)直接比较,得到的是包含4个布尔值的序列,if语句无法直接判断一组布尔值的真假,就是你遇到的报错的直接原因。 - 分支判断错误:使用了三个独立的
if而非elif,会导致同一个行的判断结果可能被多次追加到列表中,最终列表长度和df1行数不匹配。
解决方案
推荐用pandas矢量化操作实现,不需要循环,性能更高也不会出现上述报错。
首先先统一df2的列名,避免大小写问题:
df2.columns = df2.columns.str.lower()
场景1:按行对齐判断(df1第n行和df2第n行的区间匹配)
直接用numpy.where做逐元素判断:
import numpy as np df1['position'] = np.where( df1['A'] < df2['begin'], 'before', np.where(df1['A'] > df2['end'], 'after', 'within') )
场景2:全局区间判断(判断A值是否在df2所有区间的最小左边界、最大右边界范围内)
先提取全局边界再判断:
import numpy as np min_begin = df2['begin'].min() max_end = df2['end'].max() df1['position'] = np.where( df1['A'] < min_begin, 'before', np.where(df1['A'] > max_end, 'after', 'within') )
如果你坚持要使用循环写法
需要每次取df2对应行的单个区间值,而非整列比较:
position = [] for index, row in df1.iterrows(): # 取当前行对应df2的区间值 begin_val = df2.loc[index, 'begin'] end_val = df2.loc[index, 'end'] if row['A'] < begin_val: position.append('before') elif row['A'] > end_val: position.append('after') else: position.append('within') df1['position'] = position
内容的提问来源于stack exchange,提问作者Ateh_92
相关产品推荐
相关产品推荐

