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

如何以Pythonic方式获取DataFrame中非0非缺失值的索引-列-值列表

问题

给定DataFrame df:

>>> df
    A   B  C
r1  5 NaN  0
r2  0   6  0
r3  1   4  0

需要用不遍历DataFrame的Pythonic写法,得到目标列表from_to_value:

>>> from_to_value
[['r1', 'A', 5],
 ['r2', 'B', 6],
 ['r3', 'A', 1],
 ['r3', 'B', 4]]

说白了就是筛选出值既不是NaN也不是0的条目,按「行索引、列名、对应值」的格式打包成嵌套列表。

解决方案

最简洁写法

直接用stack()配合链式操作一步到位:

from_to_value = df.stack()[lambda x: x != 0].reset_index().values.tolist()

分步拆解(方便理解)

如果觉得上面一行太紧凑,拆成步骤看更清楚:

# 1. stack把列转成二级索引,自动跳过NaN值,得到带双索引的Series
stacked_series = df.stack()
# 2. 过滤掉值为0的条目
filtered = stacked_series[stacked_series != 0]
# 3. 把索引转成普通列,再转成嵌套列表
from_to_value = filtered.reset_index().values.tolist()

原理解释

  • stack():把DataFrame的列变成索引的一部分,返回的Series里,每条数据的索引是「原行名+原列名」,值是单元格内容,自动忽略NaN,这一步就帮我们干掉了所有NaN值;
  • 布尔筛选stacked_series != 0:留下值不为0的条目;
  • reset_index():把原来的双索引拆成两列,加上值列,变成一个三列的DataFrame;
  • values.tolist():把这个三列DataFrame直接转成嵌套列表,正好符合要求的格式。

内容的提问来源于stack exchange,提问作者Newbielp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 08:55:14