如何将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
相关产品推荐
相关产品推荐

