如何提取两个data.frame中至少一个存在NA值的对应行名
问题描述
现有两个结构相似的DataFrame,数据示例如下:
df1
c1-1 c2-45 c3-65 c4-88 c5-97 r1 NA 0.598817857 0.053798422 0.776829475 NA r2 0.481191121 0.67205121 0.50231424 0.933501988 0.169838618 r3 0.127680486 NA 0.188186772 NA 0.410198769 r4 0.448870194 0.372560979 0.627946034 0.277422856 0.540501786 r5 0.828152448 0.962372344 0.72686092 0.881644452 0.822969723
df2
c1-24 c2-98 c3-77 c4-82 c5-9 r1 0.528260595 0.602697657 0.15193253 0.458712206 0.785602995 r2 0.250479754 0.999715659 0.575051699 NA 0.830962509 r3 NA NA 0.733031402 0.189934875 0.554902551 r4 0.160801532 0.611729999 0.665725625 0.966146299 0.005503371 r5 0.483603251 0.306977032 0.377184726 0.109827232 0.63159439
两个DataFrame的行名完全一致,列名仅-后的后缀不同,-前的标识一一对应。需求为输出至少在其中一个DataFrame中存在NA值的行名,上述示例的预期输出为:r1、r2、r3。
实现方案
R语言实现
核心逻辑是先分别判断两个DataFrame每行是否存在NA,再取两个判断结果的并集,最后提取对应行名:
# 逐行判断df1是否存在NA,返回布尔向量 df1_na_flag <- rowSums(is.na(df1)) > 0 # 逐行判断df2是否存在NA,返回布尔向量 df2_na_flag <- rowSums(is.na(df2)) > 0 # 取并集筛选符合要求的行名 target_rows <- rownames(df1)[df1_na_flag | df2_na_flag] # 输出结果 print(target_rows)
运行后输出为"r1" "r2" "r3",和预期一致。
Python Pandas实现
逻辑和R实现一致,用pandas内置的逐行判断方法实现:
import pandas as pd # 逐行判断是否存在NA,取两个表的并集布尔掩码 na_mask = df1.isna().any(axis=1) | df2.isna().any(axis=1) # 提取对应行名转为列表 target_rows = df1[na_mask].index.tolist() print(target_rows)
运行后输出为['r1', 'r2', 'r3']。
内容的提问来源于stack exchange,提问作者biobudhan
相关产品推荐
相关产品推荐

