如何提取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元素位置,再转换格式即可,步骤如下:
- 构造示例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起始的计数方式 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
相关产品推荐
相关产品推荐

