You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:15:03