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

如何根据另一数据框填充目标数据框中的NA值?

按样本名称填充DataFrame缺失值的解决方案

R 实现方法

方法1:使用 dplyr 包(推荐,代码简洁易读)

  1. 统一两个DataFrame的样本名列名,将df2的subject_id重命名为samples;
  2. 通过样本名进行左连接,保留df1的所有行;
  3. 使用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 函数(高效简洁)

  1. 将df2转换为以样本名为键、gender为值的字典;
  2. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:42:04