如何根据数据框名称匹配生成含对应age值的新数据框?
解决方案
R语言实现
- 将单独的dataframe存入命名列表,建立名称与数据的对应关系
# 把已有的jack、ethan、ellie放入命名列表 name_dfs <- list(jack = jack, ethan = ethan, ellie = ellie)
- 批量处理每个dataframe,提取性别对应的年龄并整理成统一格式
library(dplyr) # 遍历列表生成汇总表 summary_df <- lapply(names(name_dfs), function(nm) { current_df <- name_dfs[[nm]] # 提取男性年龄,无匹配则设为0 sexM <- ifelse(any(current_df$sex == "M"), current_df$age[current_df$sex == "M"], 0) # 提取女性年龄,无匹配则设为0 sexF <- ifelse(any(current_df$sex == "F"), current_df$age[current_df$sex == "F"], 0) data.frame(name = nm, sexM = sexM, sexF = sexF) }) %>% bind_rows()
- 与mydf左连接,将未匹配项的NA替换为0
result_df <- mydf %>% left_join(summary_df, by = "name") %>% mutate(across(c(sexM, sexF), ~replace(., is.na(.), 0)))
Python Pandas实现
- 将单独的DataFrame存入字典,以名称为键
import pandas as pd # 把已有的jack、ethan、ellie放入字典 name_dfs = {"jack": jack, "ethan": ethan, "ellie": ellie}
- 遍历字典生成性别年龄汇总表
summary_data = [] for name, df in name_dfs.items(): # 获取男性年龄,无匹配则为0 sexM = df.loc[df["sex"] == "M", "age"].iloc[0] if not df[df["sex"] == "M"].empty else 0 # 获取女性年龄,无匹配则为0 sexF = df.loc[df["sex"] == "F", "age"].iloc[0] if not df[df["sex"] == "F"].empty else 0 summary_data.append({"name": name, "sexM": sexM, "sexF": sexF}) summary_df = pd.DataFrame(summary_data)
- 合并mydf与汇总表,填充未匹配项为0
result_df = mydf.merge(summary_df, on="name", how="left").fillna(0)
内容的提问来源于stack exchange,提问作者LT17
相关产品推荐
相关产品推荐

