如何根据另一数据框填充目标数据框中的NA值?
按样本名称填充DataFrame缺失值的解决方案
R 实现方法
方法1:使用 dplyr 包(推荐,代码简洁易读)
- 统一两个DataFrame的样本名列名,将df2的
subject_id重命名为samples; - 通过样本名进行左连接,保留df1的所有行;
- 使用
coalesce函数优先保留df1原有的gender值,用df2的gender填充df1的NA值。
示例代码:
library(dplyr) # 构造示例数据 df1 <- data.frame( samples = c("Pt8", "Pt102", "Pt87", "Pt1"), gender = c(NA, NA, NA, NA) ) df2 <- data.frame( subject_id = c("Pt1", "Pt102", "Pt6", "Pt8"), gender = c("male", "male", "female", "male") ) # 重命名df2的列并匹配填充 df_filled <- df1 %>% left_join(df2 %>% rename(samples = subject_id), by = "samples") %>% mutate(gender = coalesce(gender.x, gender.y)) %>% select(samples, gender) print(df_filled)
运行结果:
samples gender 1 Pt8 male 2 Pt102 male 3 Pt87 <NA> 4 Pt1 male
方法2:基础R实现(无需额外包)
通过match函数找到df1样本在df2中的位置,针对性填充NA值:
# 构造示例数据(同上) df1 <- data.frame( samples = c("Pt8", "Pt102", "Pt87", "Pt1"), gender = c(NA, NA, NA, NA) ) df2 <- data.frame( subject_id = c("Pt1", "Pt102", "Pt6", "Pt8"), gender = c("male", "male", "female", "male") ) # 匹配位置并填充 match_idx <- match(df1$samples, df2$subject_id) df1$gender[is.na(df1$gender)] <- df2$gender[match_idx[is.na(df1$gender)]] print(df1)
Python 实现方法
方法1:使用 pandas 的 map 函数(高效简洁)
- 将df2转换为以样本名为键、gender为值的字典;
- 用
map函数匹配df1的样本名,填充gender列的NA值。
示例代码:
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({ "samples": ["Pt8", "Pt102", "Pt87", "Pt1"], "gender": [pd.NA, pd.NA, pd.NA, pd.NA] }) df2 = pd.DataFrame({ "subject_id": ["Pt1", "Pt102", "Pt6", "Pt8"], "gender": ["male", "male", "female", "male"] }) # 构建样本-性别映射字典 gender_map = df2.set_index("subject_id")["gender"].to_dict() # 填充NA值 df1["gender"] = df1["gender"].fillna(df1["samples"].map(gender_map)) print(df1)
运行结果:
samples gender 0 Pt8 male 1 Pt102 male 2 Pt87 NaN 3 Pt1 male
方法2:使用 pandas 的 merge 方法
通过左连接合并两个DataFrame,再合并gender列完成填充:
import pandas as pd # 构造示例数据(同上) df1 = pd.DataFrame({ "samples": ["Pt8", "Pt102", "Pt87", "Pt1"], "gender": [pd.NA, pd.NA, pd.NA, pd.NA] }) df2 = pd.DataFrame({ "subject_id": ["Pt1", "Pt102", "Pt6", "Pt8"], "gender": ["male", "male", "female", "male"] }) # 重命名df2列并合并 merged_df = df1.merge(df2.rename(columns={"subject_id": "samples"}), on="samples", how="left", suffixes=("_df1", "_df2")) merged_df["gender"] = merged_df["gender_df1"].fillna(merged_df["gender_df2"]) df_filled = merged_df[["samples", "gender"]] print(df_filled)
内容的提问来源于stack exchange,提问作者Programming Noob
相关产品推荐
相关产品推荐

