gpt4 book ai didi

python - 根据 R 或 python 中的条件将一个列列表中的值替换为另一列列表中的值

转载 作者:太空宇宙 更新时间:2023-11-03 17:32:21 25 4
gpt4 key购买 nike

(对于Pythonistas,在我得到一些#hatehard之前,下面的代码是R的格式)

这个问题已经让我沮丧太久了。

我有 2 个数据集

df1 <- data.frame(ID = c("Person.A", "Person.B", "Person.C", "Person.D", "Person.E", "Person.F"),
Aa = c(0,1,2,NA,1,1),
Ab = c(0,NA,2,1,1,1),
Ac = c(NA,NA,2,2,1,1),
no.match = c(0,1,2,2,1,2))

df2 <- data.frame(ID = c("Person.A", "Person.B", "Person.C", "Person.D", "Person.E"),
Ba = c(0,NA,2,1,1),
Bb = c(NA,1,2,2,1),
Bc = c(0,1,2,2,1))

然后我使用 merge(df1, df2, all.x = T, by = "ID" 合并这两个数据集得到:

         ID Aa Ab Ac no.match Ba Bb Bc
1 Person.A 0 0 NA 0 0 NA 0
2 Person.B 1 NA NA 1 NA 1 1
3 Person.C 2 2 2 2 2 2 2
4 Person.D NA 1 2 2 1 2 2
5 Person.E 1 1 1 1 1 1 1
6 Person.F 1 1 1 2 NA NA NA

实际数据集要复杂得多,其中有许多列在其他列中没有匹配项。所以我认为我不能做一些取决于列排列的事情。

AaBa包含相同的信息;和列AbBb也这样做,依此类推,但列no.match不包含匹配的列。

我想“映射”Ba 同一行的值至Aa 如果 Aa是 NA,对 Ab 执行相同的操作和Bb , AcBc

本例中的结果 DF 如下所示:

        ID Aa Ab Ac no.match Ba Bb Bc
1 Person.A 0 0 0 0 0 NA 0
2 Person.B 1 1 1 1 NA 1 1
3 Person.C 2 2 2 2 2 2 2
4 Person.D 1 1 2 2 1 2 NA
5 Person.E 1 1 1 1 1 1 1
6 Person.F 1 1 1 2 NA NA NA

其中元素[4,2]被元素 [4,6] 替换行和列需要匹配。

我尝试过大量令人尴尬的事情:apply , ifelse ,迭代列列表 l1 = c('Aa','Ab','Ac'), l2 = c('Ba', 'Bb', 'Bc')

我可以一次性完成:which(is.na(mdf$Aa)) <- mdf[which(is.na(mdf$Aa)), c("Ba")]

但是我怎样才能迭代地做到这一点呢?

谢谢! (抱歉啰嗦了)

最佳答案

这是一个使用 data.table v1.9.5 的安装说明 here :

require(data.table) # v1.9.5+
cols1 = names(df1)[2:4]
cols2 = names(df2)[2:4]

foo <- function(x, y) {
nas = is.na(x)
x[nas] = y[nas]
x
}
setDT(df1)[df2, c(cols1, cols2) := c(Map(foo, mget(cols1),
mget(cols2)), mget(cols2)), on = "ID"]

> df1
# ID Aa Ab Ac no.match Ba Bb Bc
# 1: Person.A 0 0 0 0 0 NA 0
# 2: Person.B 1 1 1 1 NA 1 1
# 3: Person.C 2 2 2 2 2 2 2
# 4: Person.D 1 1 2 2 1 2 2
# 5: Person.E 1 1 1 1 1 1 1
# 6: Person.F 1 1 1 2 NA NA NA
  • setDT() 通过引用将 df1 转换为 data.table

  • setDT(df1)[df2, on = "ID"] 执行联接。对于df2的每一行,我们在df1中找到匹配的行,并提取与匹配行对应的列。

  • 在匹配的行上,我们更新 cols1 中的列并添加 cols2 中的新列通过引用使用 := 运算符。为了更新列,我们提取 cols1cols2 中指定的列,并将 NA 替换为函数 foo()。为了添加列,我们只需使用 mget() 提取列 cols2 即可。我们使用 c() 连接两个列表。

如果您有兴趣,请查看HTML vignettes了解更多信息。

关于python - 根据 R 或 python 中的条件将一个列列表中的值替换为另一列列表中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31712335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com