通过数据框中的索引快速访问行

时间:2020-02-04 11:21:25

标签: r dataframe

我正在使用巨大的数据框,需要访问和修改我使用它们的索引访问的某些行的值。

In [1]: import pandas as pd

In [2]: import re

In [3]: df = pd.DataFrame([["Atlanta, GA 30301"]], columns=["location"])

In [4]: pattern = r'([^,]+,\s*\w+)\s*\d*'

In [5]: df['location'].str.extract(pattern, flags=re.I)
Out[5]:
                        0
0    New Feliciamouth, WA
1           Bakerfurt, CO
2  Lake Elizabethview, GA
3      Robertschester, TX
4       Robinsonmouth, AL
5        North Connor, AZ
6          Morganstad, WA
7         New Roberto, IA
8         Collierstad, DC
9          Reneemouth, NJ

问题是,当开始和结束位置过高时,访问这些行的时间将变得过多。例如,访问df[start:end,]$column <- value 几乎是立即的,但是访问df[1:2,]则需要几分钟,这导致这种方法不切实际。

必须有一种更快的访问方式,因为运行df[100000001:100000002,]的{​​{1}}特定于行中的元素(例如100000001)仅需要几秒钟。但是,您可以猜到,使用which(df$column1==value1)返回的索引访问数据帧并不能解决问题,因为最终将实现与上述示例相同的访问。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

答案不多,但是测试@jogo建议的解决方案中最快的解决方案。从data.frame更改为matrix似乎是可行的方法。

library(microbenchmark)
dta <- data.frame(x= rnorm(10000), y= rnorm(10000))
dta_m <- as.matrix(dta)
microbenchmark(
    fast = {dta[1:20, ]$x <- 4},
    fast2 = {dta[1:20,"x"] <- 4},
    fast3 = {dta$x[1:20] <- 4},
    fast_matrix = {dta_m[1:20,"x"] <- 4},
    slow = {dta[9980:10000, ]$x <- 4},
    slow2 = {dta[9980:10000,"x"] <- 4},
    slow3 = {dta$x[9980:10000] <- 4},
    slow_matrix = {dta_m[9980:10000,"x"] <- 4}, times=50)

结果

   Unit: microseconds
        expr  min   lq    mean median    uq   max neval
        fast 87.9 95.2 111.390 106.15 113.8 219.0    50
       fast2 31.3 33.8  38.818  36.05  39.9  89.1    50
       fast3 13.0 14.7  18.462  15.85  17.6  66.5    50
 fast_matrix  1.1  1.8   2.600   2.10   2.5  22.8    50
        slow 89.0 96.3 109.822 108.80 112.3 182.8    50
       slow2 31.9 33.9  40.446  38.30  41.0 105.0    50
       slow3 13.4 15.5  19.544  16.45  18.4  65.8    50
 slow_matrix  1.1  1.5   2.084   2.15   2.5   3.2    50