You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用布尔掩码提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:30:45