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

如何提取pandas DataFrame中非NaN元素的行列索引二维向量?

问题描述

现有如下DataFrame(空值为NaN):

,,,,,,
,,2.0,,,,
,2.0,,2.23606797749979,,,
,,2.23606797749979,,,2.0,
,,,,,2.23606797749979,
,,,2.0,2.23606797749979,,
,,,,,,

需求是获取一个二维向量,其中每个元素为DataFrame中非NaN元素对应的行索引与列索引组成的列表(索引从1开始计数),预期输出:

[[2,1],[1,2],[3,2],[2,3],[5,3],[3,5],[4,5],[5,4]]

尝试过iloc与np.where函数,但无法结合实现需求。

解决方案

直接通过numpy.where定位非NaN元素位置,再转换格式即可,步骤如下:

  1. 构造示例DataFrame并定位非NaN元素的索引:
import pandas as pd
import numpy as np

# 还原示例DataFrame
df = pd.DataFrame([
    [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
    [np.nan, np.nan, 2.0, np.nan, np.nan, np.nan],
    [np.nan, 2.0, np.nan, 2.23606797749979, np.nan, np.nan],
    [np.nan, np.nan, 2.23606797749979, np.nan, np.nan, 2.0],
    [np.nan, np.nan, np.nan, np.nan, np.nan, 2.23606797749979],
    [np.nan, np.nan, np.nan, 2.0, 2.23606797749979, np.nan],
    [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]
])

# 提取非NaN元素的行、列索引(numpy默认从0开始计数)
rows, cols = np.where(df.notna())
  1. 将索引配对并转换为1起始的格式:
# 列表推导式配对行、列索引,同时+1转为1起始的计数方式
result = [[r+1, c+1] for r, c in zip(rows, cols)]
print(result)

运行后输出结果与预期完全一致:

[[2, 1], [1, 2], [3, 2], [2, 3], [5, 3], [3, 5], [4, 5], [5, 4]]

关键说明

  • df.notna()生成布尔值DataFrame,标记所有非NaN的位置
  • np.where(df.notna())返回两个一维数组,分别对应所有非NaN元素的行、列索引(0起始)
  • 由于预期输出要求索引从1开始,因此给每个索引值加1,再通过列表推导式完成配对

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 09:16:35