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

两个不同形状DataFrame用np.where多条件判断报错如何解决

报错原因

你写的代码默认将nv1和db1按同索引行逐行比较,但两个DataFrame形状、索引都不匹配,所以触发ValueError: Can only compare identically-labeled Series objects错误。你的需求是对nv1每一行,检查是否匹配db1所有行的任意一个区间,而非仅匹配同索引行的区间。

解决方法

提供两种实现方案,可根据数据量选择:

方案1:apply实现(适合小数据集,逻辑直观)

import pandas as pd
import numpy as np

# 你的原有数据无需修改,新增如下逻辑
def check_novel(row):
    # 判断当前行的MinBP或MaxBP是否落在db1的任意区间内
    matched = ((db1['min_bp'] <= row['MinBP']) & (row['MinBP'] <= db1['max_bp'])) | \
              ((db1['min_bp'] <= row['MaxBP']) & (row['MaxBP'] <= db1['max_bp']))
    return 'No' if matched.any() else 'Yes'

nv1['Novel_in_Database'] = nv1.apply(check_novel, axis=1)

方案2:numpy广播实现(适合大数据集,性能更高)

如果你的数据量过万,apply的循环开销会比较大,用向量化运算速度提升明显:

# 提取区间数组做广播匹配
db_arr = db1[['min_bp', 'max_bp']].values
nv_min = nv1['MinBP'].values[:, np.newaxis]
nv_max = nv1['MaxBP'].values[:, np.newaxis]

# 批量判断是否存在匹配区间
has_matched = (
    ((db_arr[:,0] <= nv_min) & (nv_min <= db_arr[:,1])) |
    ((db_arr[:,0] <= nv_max) & (nv_max <= db_arr[:,1]))
).any(axis=1)

nv1['Novel_in_Database'] = np.where(has_matched, 'No', 'Yes')

两种方案运行后得到的nv1均和预期输出一致。

内容的提问来源于stack exchange,提问作者zillur rahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:00:03