两个不同形状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
相关产品推荐
相关产品推荐

