我正在尝试将一些 R 代码(不是我编写的)转换为项目的 python 代码。 R 代码使用aggregate() 进行一些分组求和,但是当我尝试使用.groupby 在Python 中复制该操作时,结果有所不同。 R 代码生成超过 479000 行的数据帧,而 Python 生成超过 489000 行的数据帧。
后来发现,R 也有这个 group_by() 函数,当在那个巨大的数据帧上使用时,结果与 Python 中的 .groupby 产生的结果相同
test <- df %>% group_by(A, B, C) %>%
summarise(D= sum(D, na.rm=TRUE), E= sum(E,na.rm=TRUE))
test <- aggregate(x=list(D= df$D, E= df$E), by=list(A= df$A, B= df$B, C=df$C),
FUN=function(x) sum(x, na.rm=TRUE))
test= df.groupby(['A', 'B', 'C'],as_index=False)['D', 'E'].agg('sum')
我几乎可以肯定我没有搞砸编码,因为我从事的项目强调保密性,以上代码是我能提供的最好的代码,提前抱歉。
很明显,这些方法中至少有一种是错误的,并且两个函数必须以不同的方式运行才会导致这种情况。我真的很想知道它们之间的区别以及哪个函数在实现我所需要的方面是正确的(即)。非常感谢。
最佳答案
很难知道确切的原因,但这是 aggregate
与 na.action
的一个潜在问题。默认情况下,它可以删除带有 NA
的行。一个选项是添加 na.action = na.pass
使用可重现的示例
set.seed(24)
df1 <- data.frame(col1 = rep(letters[1:4], each = 4),
col2 = sample(c(1:5, NA), 16, replace = TRUE), col3 = NA)
极端情况,其中一列全部不适用
aggregate(.~ col1, df1, sum, na.rm = TRUE)
Error in aggregate.data.frame(lhs, mf[-1L], FUN = FUN, ...) : no rows to aggregate
aggregate(.~ col1, df1, sum, na.rm = TRUE, na.action = na.pass)
# col1 col2 col3
#1 a 13 0
#2 b 5 0
#3 c 11 0
#4 d 16 0
因此,根据列中任何位置的 NA 数量,该行可能会被删除,这将反射(reflect)在计算中
关于python - 当我尝试总结按几个标准分组的几列时,R 中的aggregate 和 group_by 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56983571/