pandas查找字段值匹配另一字段处理结果的索引失效排查
问题根源
筛选无返回值是三个问题叠加导致的:
- DataFrame构造逻辑错误:构造
df3时Open Time列直接传入了带intersect_前缀的intersect列表,列值本身和去掉前缀的intersect列值不可能匹配;另外代码里df['LEVEL']=np.nan存在笔误,df变量未定义,运行会直接报错。 - NaN等值比较规则限制:pandas中
np.nan == np.nan返回结果为False,哪怕两行两列都是空值,直接用==判断也不会识别为匹配。 - 字符串替换参数不明确:部分pandas版本下
str.replace默认正则模式,固定字符串替换时不显式指定参数可能出现意外匹配问题。
修复代码
首先修正DataFrame构造逻辑,保证Open Time列后两位为纯时间格式,再执行筛选:
import pandas as pd import numpy as np Open_Time_s=['2022-04-30 11:05:00+03:00','2022-04-30 11:10:00+03:00'] intersect=[np.nan,np.nan,'intersect_2022-04-30 11:05:00+03:00','intersect_2022-04-30 11:10:00+03:00'] # 对齐Open Time列长度,前两位为空值,后两位为纯时间字符串 open_time_col = [np.nan, np.nan] + Open_Time_s df3 = pd.DataFrame({'Open Time': open_time_col, 'intersect': intersect}) df3['LEVEL'] = np.nan # 处理intersect列,移除固定前缀 processed_intersect = df3['intersect'].str.replace('intersect_', '', regex=False) # 构造匹配掩码,仅匹配时间值相等的行 match_mask = df3['Open Time'].eq(processed_intersect) # 如果需要把两列都是空值的行也判定为匹配,替换为下面的mask # match_mask = df3['Open Time'].eq(processed_intersect) | (df3['Open Time'].isna() & df3['intersect'].isna()) # 筛选匹配行 match_result = df3[match_mask] print(match_result) # 获取匹配行索引 match_index = df3.index[match_mask] print(match_index)
运行结果
执行后会正确匹配到后两行时间一致的记录,返回索引为Int64Index([2, 3], dtype='int64'),如果开启双空行匹配,会同时返回索引0、1的空值行。
内容的提问来源于stack exchange,提问作者максим ильин
相关产品推荐
相关产品推荐

