首页 > 解决方案 > 如何获得以布尔为条件的行和列索引,并将所述索引应用于另一个数据框?

问题描述

我有 2 个数据框,res_params并且res_tStats. 两个数据框中的列和索引是相同的。只有每一行和每一列中的(如果你愿意,相当于 Excel 中的“单元格”)不同。

我需要从数据框中获取行和列的索引,res_tStats然后abs(res_tStats) > 1.96将格式应用于数据框中的相同索引和行。res_params

我做了什么

# res_tStats is a NxM dataframe with shape (6, 4)
# res_params is a NXM dataframe with shape (6, 4)

idx_required = np.where(abs(res_tStats) > 1.96)

print(idx_required)
# output: array([0, 0, 0, 5, 5, 5, 5]), array([0, 2, 3, 0, 1, 2, 3]))

到目前为止,一切都很好。它给了我正确的索引位置 where abs(res_tStats) > 1.96。以下值实际上很重要:

第 0 行,第 0
行 第 0 行,第 2
行 第 0 行,第 3
行 第 5 行,第 0
行 第 5 行,第 1
行 第 5 行,第 2
行 第 5 行,第 3 行

现在,当我将这些索引位置应用于 时res_params,我期望在完全相同的索引位置获得值。但是,我不太明白。

运行:res_params.iloc[idx_required]返回形状为 (7, 7) 的 df。

idx_required我通过申请来仔细检查res_tStats,希望只得到 > 1.96 的值,但是这并没有发生。
res_tStats.iloc[idx_required] 还返回一个形状为 (7, 7) 的 df,其中的一些值低于 1.96

标签: pythonpandasnumpydataframeboolean

解决方案


问题是它idx_required是一个带有索引和列的元组, .iloc如果你传递一个元组,它会以交叉积的方式选择它们。

一个简单的解决方法是:

res_params[np.abs(res_tStats)>1.96]

这将返回一个数据框,其中包含条件不成立的res_params地点np.abs(res_tStats)>1.96和地点的值。NaN

另一种方法是获取元素列表:

res_params.to_numpy()[idx_required]

这样,您将获得元素列表,没有相应的索引或列。


推荐阅读