簡體   English   中英

在相鄰列中查找對值的有效方法(Python/R/Sql)

[英]efficient way finding pair value in adjacent columns (Python/R/Sql)

我在 pandas 中有一個數據框(下面的df ),有幾百萬行 * 20 列。

並給定一對值,我試圖找出它們是否存在於df的相鄰列中。

例如df看起來像

在此處輸入圖像描述

給定值對(a3, b2) ,我們發現它們存在於相鄰列中(不必在同一行中)。

對於值對(b2, a3) ,我們認為它們不滿足條件(列的移動應該向右)。

這可以通過對小數據集使用循環來完成,但我有數百萬條記錄,有 20 列和很多對要檢查。 有沒有辦法有效地計算這個? 謝謝!

這是一個基本的 R 解決方案,通過定義 function isAdjacent

isAdjacent <- function(df,p) {
    colnum <- col(df)
    diff(sapply(p,function(x) colnum[df==x],USE.NAMES = FALSE))==1
}

其中df是 data.frame, p是對。

例子

p1 <- c("b1","c2")
p2 <- rev(p1)
p3 <- c("a1","c3")

> isAdjacent(df,p1)
[1] TRUE

> isAdjacent(df,p2)
[1] FALSE

> isAdjacent(df,p3)
[1] FALSE

數據

> dput(df)
structure(list(A = c("a1", "a2", "a3", "a4"), B = c("b1", "b2", 
"b3", "b4"), C = c("c1", "c2", "c3", "c4"), D = c("d1", "d2", 
"d3", "d4"), E = c("e1", "e2", "e3", "e4"), F = c("f1", "f2",
"f3", "f4"), G = c("g1", "g2", "g3", "g4")), class = "data.frame", row.names = c(NA, 

-4L))

大數據示例(基准測試)

df <- setNames(as.data.frame(sapply(letters[1:20], paste0, 1:1e6)), LETTERS[1:20])

p <- c("a1", "c3")
system.time({
    isAdjacent <- function(df, p) {
        colnum <- col(df)
        diff(sapply(p, function(x) colnum[df == x], USE.NAMES = FALSE)) == 1
    }
    isAdjacent(df, p)
})
#   user  system elapsed 
#   1.03    0.07    1.11

library(data.table)
system.time({
    DT <- data.table(VAL = unlist(df), COL = rep(1L:ncol(df), each = nrow(df)), key = "VAL")
    isadj <- function(left, right) {
        DT[.(left), .(COL = COL + 1L)][DT[.(right)], on = .(COL), nomatch = 0L, .N > 0L]
    }
    isadj(p[1], p[2])
})

#   user  system elapsed
#  35.79    1.91   36.24

在 ThomasIsCoding 的帖子中使用df ,這是在 R 中使用data.table的選項:

library(data.table)
DT <- data.table(VAL=unlist(df), COL=rep(1L:ncol(df), each=nrow(df)), key="VAL")
isadj <- function(left, right) {
    DT[.(left), .(COL=COL+1L)][DT[.(right)], on=.(COL), nomatch=0L, .N > 0L]
}

isadj("a3", "b2")    
#[1] TRUE

isadj("b2", "a3")    
#[1] FALSE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM