如何利用布尔掩码提取Pandas DataFrame中对应True值的非NaN元素并生成列表?
提取DataFrame中布尔掩码True位置的元素
问题场景
我们有三个DataFrame:
- 真实数据
df_true:
import pandas as pd import numpy as np 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_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_imp:
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'])
通过m = df_nan.isnull()生成布尔掩码标记填充位置后,使用df_imp[m]会返回带大量NaN的DataFrame,我们需要提取这些位置的填充值和真实值,生成纯值列表。
解决方案
方法1:利用stack()过滤NaN后转列表
stack()会自动忽略NaN值,将二维结构转为一维Series,再通过tolist()转成列表:
# 提取填充值 filled_values = df_imp[m].stack().tolist() # 提取对应位置的真实值 true_values = df_true[m].stack().tolist()
结果:
filled_values:[1.0, 2.0, 8.0, 8.0, 25.0, 6.0]true_values:[1.0, 0.0, 3.0, 8.0, 30.0, 6.0]
方法2:直接通过numpy数组索引
利用掩码的numpy数组直接索引DataFrame的底层数组,效率更高:
# 提取填充值 filled_values = df_imp.values[m.values].tolist() # 提取对应位置的真实值 true_values = df_true.values[m.values].tolist()
结果与方法1一致,若需要整数类型,可额外添加astype(int):
filled_values = df_imp.values[m.values].astype(int).tolist()
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

