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

如何将DataFrame中除NaN外的浮点值替换为对应行索引名?

实现方法

首先构造示例DataFrame(方便你复现测试):

import pandas as pd
import numpy as np

df = pd.DataFrame(
    [[10.0, 190.6],
     [17.9, np.nan],
     [np.nan, 8.0],
     [9.0, 70.0]],
    index=['index1', 'index2', 'index3', 'index4']
)

以下是几种高效的实现方式:

方法1:逐行处理(简洁直观)

利用apply按行遍历,对每行中非NaN的元素替换为行索引名称:

df_result = df.apply(lambda row: row.where(pd.isna(row), row.name), axis=1)

逻辑说明:row.where(pd.isna(row), row.name)会保留原行中的NaN值,将其余元素替换为当前行的索引名(row.name)。

方法2:广播索引值(性能更优)

通过构造与原DataFrame结构一致、值为对应行索引的新DataFrame,再结合where完成替换:

# 创建全为行索引值的DataFrame
index_matrix = np.tile(df.index.to_numpy(), (len(df.columns), 1)).T
index_df = pd.DataFrame(index_matrix, index=df.index, columns=df.columns)

# 替换非NaN值
df_result = df.where(pd.isna(df), index_df)

逻辑说明:先生成和原表形状相同的索引值矩阵,再用原表的NaN值过滤,保留索引矩阵中对应非NaN位置的值。

方法3:numpy广播(底层高效)

直接用np.where进行元素级判断替换:

df_result = pd.DataFrame(
    np.where(pd.notna(df), df.index.to_numpy()[:, np.newaxis], np.nan),
    index=df.index,
    columns=df.columns
)

逻辑说明:pd.notna(df)生成布尔矩阵标记非NaN位置,df.index.to_numpy()[:, np.newaxis]将索引转为列向量实现广播匹配,最终替换对应位置的值。

执行任意一种方法后,df_result的输出即为你期望的结果:

0        1
index1  index1  index1
index2  index2     NaN
index3     NaN  index3
index4  index4  index4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:10:11