如何在给定布尔掩码的情况下选择PandasDataFrame的元素?

xwbd5t1u  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(139)

我想知道,如果给定一个布尔掩码,是否有一种方法可以检索位于掩码中 True 值对应位置的DataFrame的所有元素。
在我的例子中,我有一个包含某个数据集的值的DataFrame,例如,让我们以下面的例子为例:

l = [[5, 3, 1], 
     [0, 3, 1], 
     [7, 3, 0], 
     [8, 5, 23], 
     [40, 4, 30],
     [2, 6, 13]]
df_true = pd.DataFrame(l, columns=['1', '2', '3'])
df_true

然后,我随机地将一些值替换为“np.nan”,如下所示:

l2 = [[5, 3, np.nan], 
     [np.nan, 3, 1], 
     [7, np.nan, 0], 
     [np.nan, 5, 23], 
     [40, 4, np.nan],
     [2, np.nan, 13]]
df_nan= pd.DataFrame(l2, columns=['1', '2', '3'])
df_nan

假设在应用一些插补算法后,我得到了如下结果:

l3 = [[5, 3, 1], 
     [2, 3, 1], 
     [7, 8, 0], 
     [8, 5, 23], 
     [40, 4, 25],
     [2, 6, 13]]
df_imp= pd.DataFrame(l3, columns=['1', '2', '3'])
df_imp

现在,我想创建两个列表(或数组),一个包含 * 插补 * 值,另一个包含 * 真 * 值,以便比较它们。为此,我首先创建了一个掩码m = df_nan.isnull(),它的值为 * 真 *,对应于包含插补值的单元格。通过将掩码应用为df_imp[m],我得到:
有没有一种方法可以只得到值而不加上 Nan,并将它们放入列表中?

lmvvr0a8

lmvvr0a81#

可以使用df.values返回DataFrame的numpy表示形式,然后使用numpy.isnan并保留其他值。

import numpy as np
arr = df.values
res = arr[~np.isnan(arr)]
print(res)
# [1. 2. 8. 8. 25. 6.]

相关问题