Pandas DataFrame.loc多条件筛选结果为空,疑与布尔序列Name属性有关?
问题解答
核心结论
第二个条件结果中的Name属性不会导致逻辑与(&)操作失效。Pandas在执行布尔Series间的运算时,仅依据索引对齐元素,Name属性不参与运算逻辑,不会影响最终的布尔结果。
筛选结果为空的可能原因及排查步骤
从你提供的两个条件结果来看,索引1应该同时满足两个条件,理论上筛选结果应包含该行。出现空结果的常见原因及排查方法如下:
验证布尔运算的实际结果
直接计算两个条件的逻辑与,查看最终的布尔Series:cond = (df['RiskDate'] == df['valStart']) & (df['valEnd'] != last_date_pm) print(cond)如果结果中没有
True值,说明实际比较结果和你单独打印的条件有差异。检查目标行的实际值匹配情况
针对索引1,直接验证两个条件的真实性:# 验证RiskDate与valStart是否相等 print("RiskDate vs valStart:", df.loc[1, 'RiskDate'], df.loc[1, 'valStart'], df.loc[1, 'RiskDate'] == df.loc[1, 'valStart']) # 验证valEnd是否不等于last_date_pm print("valEnd vs last_date_pm:", df.loc[1, 'valEnd'], last_date_pm, df.loc[1, 'valEnd'] != last_date_pm)有可能存在打印结果未显示的细节差异,比如日期对象的实际存储值不一致(虽然格式显示相同)。
确认索引对齐情况
检查两个布尔Series的索引是否完全一致:print("条件1索引:", (df['RiskDate'] == df['valStart']).index) print("条件2索引:", (df['valEnd'] != last_date_pm).index)如果索引存在不匹配(比如一个是整数索引,另一个是带名称的索引或其他类型),会导致运算结果不符合预期。
检查列选择是否有效
暂时去掉列选择部分,仅筛选行,看是否能得到结果:df_s = df.loc[((df['RiskDate'] == df['valStart']) & (df['valEnd'] != last_date_pm))] print(df_s)如果此时有结果,说明
['Start'] + selected_cols中存在不存在的列,导致返回空DataFrame。
内容的提问来源于stack exchange,提问作者007
相关产品推荐
相关产品推荐

