比较两个卡丁车赛事数据集列按条件返回布尔值时报错如何解决
问题背景
我有两个各含9列的卡丁车赛事数据集:
- df1数据集截图:

- df2数据集截图:

需要设置多组对比条件,判断两个数据集对应列是否满足要求后返回True或False,具体条件如下:
- race_start (df1) <= race_start (df2)
- race_end (df1) >= race_end(df2)
- safety_start(df1) <= safety_start (df2)
- safety_end (df1) >= safety_end (df2)
- starting_front (df1) <= starting_front (df2)
- starting_back (df1) <= starting_back (df2)
- pitstop (df1) >= pitstop (df2)
- no_pitstop (df1) >= no_pitstop (df2)
- status (df1) = status (df2)
原实现代码如下:
import numpy as np df1['race_start_final'] = np.where(df1.race_start <= df2.race_start, 'True', 'False') df1['race_end_final'] = np.where(df1.race_end >= df2.race_end, 'True', 'False') df1['safety_start_final'] = np.where(df1.safety_start <= df2.safety_start, 'True', 'False') df1['safety_end_final'] = np.where(df1.safety_end >= df2.safety_end, 'True', 'False') df1['starting_front_final'] = np.where(df1.starting_front <= df2.starting_front, 'True', 'False') df1['starting_back_final'] = np.where(df1.starting_back <= df2.starting_back, 'True', 'False') df1['pitstop_final'] = np.where(df1.pitstop >= df2.pitstop, 'True', 'False') df1['pitstop_final'] = np.where(df1.pitstop >= df2.pitstop, 'True', 'False') df1['status_final'] = np.where(df1.status == df2.status, 'True', 'False')
运行后报错:
ValueError: Can only compare identically-labeled Series objects
错误原因
原实现的业务逻辑是正确的,报错核心原因是两个DataFrame的行索引标签不匹配,pandas做Series元素级比较时默认要求索引完全对齐,索引不一致就会抛出该错误。另外原代码存在两个小问题:重复定义了两次pitstop_final列,遗漏了no_pitstop_final的判断逻辑。
解决方案
场景1:两个表按行顺序一一对应对比
如果df1和df2的行是按顺序匹配的(第N行df1对应第N行df2),可通过将Series转为numpy数组的方式跳过索引对齐检查,两种实现如下:
简洁版(直接生成布尔类型列)
# 用.values属性转为numpy数组,跳过索引对齐校验 df1['race_start_final'] = df1.race_start.values <= df2.race_start.values df1['race_end_final'] = df1.race_end.values >= df2.race_end.values df1['safety_start_final'] = df1.safety_start.values <= df2.safety_start.values df1['safety_end_final'] = df1.safety_end.values >= df2.safety_end.values df1['starting_front_final'] = df1.starting_front.values <= df2.starting_front.values df1['starting_back_final'] = df1.starting_back.values <= df2.starting_back.values df1['pitstop_final'] = df1.pitstop.values >= df2.pitstop.values df1['no_pitstop_final'] = df1.no_pitstop.values >= df2.no_pitstop.values df1['status_final'] = df1.status.values == df2.status.values
保留np.where写法(可自定义返回值)
如果需要返回字符串类型的'True'/'False',可沿用np.where写法:
import numpy as np df1['race_start_final'] = np.where(df1.race_start.values <= df2.race_start.values, 'True', 'False') df1['race_end_final'] = np.where(df1.race_end.values >= df2.race_end.values, 'True', 'False') df1['safety_start_final'] = np.where(df1.safety_start.values <= df2.safety_start.values, 'True', 'False') df1['safety_end_final'] = np.where(df1.safety_end.values >= df2.safety_end.values, 'True', 'False') df1['starting_front_final'] = np.where(df1.starting_front.values <= df2.starting_front.values, 'True', 'False') df1['starting_back_final'] = np.where(df1.starting_back.values <= df2.starting_back.values, 'True', 'False') df1['pitstop_final'] = np.where(df1.pitstop.values >= df2.pitstop.values, 'True', 'False') df1['no_pitstop_final'] = np.where(df1.no_pitstop.values >= df2.no_pitstop.values, 'True', 'False') df1['status_final'] = np.where(df1.status.values == df2.status.values, 'True', 'False')
场景2:两个表需按唯一键对齐后对比
如果需要按赛事ID等唯一键匹配后再对比,可先执行表关联操作:
# 假设两个表都有race_id作为唯一匹配键,suffixes用于区分两个表的同名字段 merged_df = df1.merge(df2, on='race_id', suffixes=('_df1', '_df2')) # 基于关联后的表执行判断 merged_df['race_start_final'] = merged_df['race_start_df1'] <= merged_df['race_start_df2'] # 其余列判断逻辑以此类推即可
内容的提问来源于stack exchange,提问作者SAV
相关产品推荐
相关产品推荐

