如何用dataframe中risk列的整数替换对应行的文本单元格值
核心需求
把DataFrame中所有species开头的列里,非NA的文本值,统一替换成对应行的risk列数值,原NA位置保持不变。
实现方案(基于pandas)
方法1:逐行apply,逻辑直白易上手
适合新手快速理解,不需要记复杂的向量化逻辑:
import pandas as pd import numpy as np # 先定义需要处理的species类列范围,排除id、risk两个固定列 species_col_list = [col for col in df.columns if col.startswith("species")] # 逐行遍历处理 df[species_col_list] = df.apply( lambda row: row[species_col_list].where( cond=pd.isna(row[species_col_list]), # 单元格是NA就保留原值 other=row["risk"] # 非NA的文本值,替换成当前行的risk值 ), axis=1 )
方法2:向量化批量处理,大数据量下效率更高
如果表格行数超过万级,逐行循环速度会很慢,用掩码匹配的方式效率能提升一个量级:
# 生成位置掩码:species列里非NA的位置标记为True replace_mask = df[species_col_list].notna() # 按行对齐risk值,把掩码标记为True的位置批量替换 df[species_col_list] = df[species_col_list].mask( cond=replace_mask, other=df["risk"], axis=0 )
注意事项
- 如果你的数据里的NA是字符串格式的
"NA",而不是pandas/numpy的原生缺失值,只要把判断条件从pd.isna()换成!= "NA"即可,比如replace_mask = df[species_col_list] != "NA" - 两个方法处理完的结果完全匹配目标输出,不会改动
id和risk两列的原始值
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

