Python 连接或循环以从另一个表更新现有列
您好,我正在尝试使用merge函数更新分母表的一列。桌子就是这样的Python 连接或循环以从另一个表更新现有列,python,pandas,Python,Pandas,您好,我正在尝试使用merge函数更新分母表的一列。桌子就是这样的 Table A A B C D E 1 2 5 2 a 2 2 5 3 a 3 3 6 4 c 4 4 4 1 c 700rows Table B A B C D E 1 2 5 2 c 2 2 5 3 c 3 3 6 4 c 500rows 第一个表是我从DB获得的,固定数量的记录需要用作分母,因此总行数不能更改,第二个表是我也从另一台服务器提取的,更新信息为E列。表B的行数小于行数(固定)我只想从表B中尽可能多地
Table A
A B C D E
1 2 5 2 a
2 2 5 3 a
3 3 6 4 c
4 4 4 1 c
700rows
Table B
A B C D E
1 2 5 2 c
2 2 5 3 c
3 3 6 4 c
500rows
第一个表是我从DB获得的,固定数量的记录需要用作分母,因此总行数不能更改,第二个表是我也从另一台服务器提取的,更新信息为E列。表B的行数小于行数(固定)我只想从表B中尽可能多地更新表A中的E列。我尝试了所有类型的联接,它们在更新后会更改行号,您有什么想法可以通过合并函数或其他方法解决吗
输出应为:
A B C D E
1 2 5 2 c
2 2 5 3 c
3 3 6 4 c
4 4 4 1 c
700 rows
表A的行号不会更改。但仅列E的行号会由表B中的相同记录(如果存在)更新
非常感谢你 我不认为这是最优雅的方式,但这段代码应该适用于R:
TableA=data.frame(A=c(1,2,3,4),B=c(2,2,3,4),c=c(5,5,6,4),D=c(2,3,4,1),E=c(“A”,“A”,“c”,“c”))
表B=数据帧(A=c(1,2,3,4),B=c(2,2,3,4),c=c(5,5,6,4),D=c(2,3,4,1),E=c(“c”,“c”,“c”,“c”))
使用for
循环测试每一行TableA
与每一行TableB
的对比,并将TableA
的E
列替换为TableB
的E列(对于a、B、C、D列):
for(1中的i:nrow(表b))
{
如果(长度(grep(FALSE,TableB[i,c(1:4)]==TableA[i,c(1:4)])==0){TableA[i,E]=TableB[i,E]}
else{}
}
以及输出:
>表a
A、B、C、D、E
1 1 2 5 2 c
2 2 5 3 c
3 3 6 4 c
4 1 c
它回答了您的问题吗?在R中,我认为您可以执行左键联接
以保持第一个数据集中的行不变,然后使用合并
从B
数据集中(如果存在)或从A
选择值
library(dplyr)
left_join(A, B, by = c("A", "B", "C", "D")) %>%
mutate(E = coalesce(E.y, E.x)) %>%
select(-E.x, -E.y)
# A B C D E
#1 1 2 5 2 c
#2 2 2 5 3 c
#3 3 3 6 4 c
#4 4 4 4 1 c
数据
假设A
和B
是两个数据集
A <- structure(list(A = 1:4, B = c(2L, 2L, 3L, 4L), C = c(5L, 5L,
6L, 4L), D = c(2L, 3L, 4L, 1L), E = structure(c(1L, 1L, 2L, 2L
), .Label = c("a", "c"), class = "factor")), class = "data.frame",
row.names = c(NA, -4L))
B <- structure(list(A = 1:3, B = c(2L, 2L, 3L), C = c(5L, 5L, 6L),
D = 2:4, E = structure(c(1L, 1L, 1L), .Label = "c", class = "factor")),
class = "data.frame", row.names = c(NA, -3L))
A我想这不是一个R问题,为什么R和sql的标题是pandas?只是想看看是否有人也可以在R中求解,或者我可以在sql中上传这两个表以在sql中求解。我现在只是想用熊猫来解决问题。非常感谢,dplyr几乎解决了99%的问题,只添加了5到6个副本就可以了。@YueShang很高兴能帮上忙!如果您觉得投票按钮对您有用,请单击投票按钮旁边的复选标记,随时进行投票。:-)每个帖子只能接受一个答案。