熊猫加入或循环以更新另一个表中的现有列

时间:2019-11-18 23:44:42

标签: 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

第一个表是我从数据库中获得的,具有固定数量的记录需要用作分母,因此总行数不变,第二个表是我也从另一个服务器中拉出的表表B的行数小于表A的行数(固定)。我只是想尽可能地更新表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中存在相同的记录,它就会被更新。

非常感谢您!

2 个答案:

答案 0 :(得分:1)

在R中,我认为您可以执行left_join来保持第一个数据集中的行不变,然后从B数据集中(如果存在)或使用Acoalesce中选择值

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

数据

假设AB是两个数据集。

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))

答案 1 :(得分:0)

我认为这不是最优雅的方法,但是这段代码应该可以在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"))
TableB = 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("c","c","c","c") )

使用for循环来测试TableA的每一行与TableB的每一行,并将E的{​​{1}}列替换为TableA的列E,如果行相同(对于A,B,C,D列):

TableB

输出:

for(i in 1:nrow(TableB))
{
  if(length(grep(FALSE,TableB[i,c(1:4)]==TableA[i,c(1:4)]))==0){TableA[i,"E"] = TableB[i,"E"]}
  else{}
}

它回答了您的问题吗?