使用Pandas query匹配数组返回空DataFrame,求助问题原因
问题原因与解决方案
问题出在哪?
df.query没法直接处理二维数组的整体相等判断:
- 你写的
colname == [@queryArray]会触发元素级对比,返回的是二维布尔数组,而df.query需要每行返回单个布尔值来决定是否保留,这种对比逻辑完全不符合要求,自然返回空DataFrame。 - 另外
query语法对复杂数据类型(比如二维数组/列表)的支持有限,没法直接识别“整个数组完全匹配”的需求。
正确的处理方式
根据你单元格里存储的是Python列表还是numpy数组,用以下方法筛选:
情况1:单元格是Python列表
把每个单元格的列表转成numpy数组,用np.array_equal做整体相等判断:
import numpy as np queryArray = np.array([[x1, y1], [x2, y2]]) # 生成布尔掩码,判断每行的colname是否和目标数组完全匹配 mask = df['colname'].apply(lambda cell: np.array_equal(np.array(cell), queryArray)) # 筛选匹配的行 result_df = df[mask]
情况2:单元格已经是numpy数组
直接用np.array_equal对比即可:
mask = df['colname'].apply(lambda cell: np.array_equal(cell, queryArray)) result_df = df[mask]
处理浮点数精度问题
如果数组里是浮点数,可能因为精度误差导致np.array_equal不匹配,换成np.allclose:
mask = df['colname'].apply(lambda cell: np.allclose(np.array(cell), queryArray))
内容的提问来源于stack exchange,提问作者Jodri
相关产品推荐
相关产品推荐

