【发布时间】:2021-09-30 01:55:32
【问题描述】:
我正在尝试将我的一些 R 脚本“翻译”成 Python,但我注意到,在 Python 中处理数据帧比在 R 中执行它要慢得多,例如根据某些条件提取细胞。
我做了一点调查,这是在 Python 中查找特定值需要多少时间:
import pandas as pd
from timeit import default_timer as timer
code = 145896
# real df is way bigger
df = pd.DataFrame(data={
'code1': [145896, 800175, 633974, 774521, 416109],
'code2': [100, 800, 600, 700, 400],
'code3': [1, 8, 6, 7, 4]}
)
start = timer()
for _ in range(100000):
desired = df.loc[df['code1']==code, 'code2'][0]
print(timer() - start) # 19.866242500000226 (sec)
在 R 中:
code <- 145896
df <- data.frame("code1" = c(145896, 800175, 633974, 774521, 416109),
"code2" = c(100, 800, 600, 700, 400),
"code3" = c(1, 8, 6, 7, 4))
start <- Sys.time()
for (i in 1:100000) {
desired <- df[df$code1 == code, "code2"]
}
print(Sys.time() - start) # Time difference of 1.140949 secs
我对 Python 比较陌生,我可能遗漏了一些东西。有什么方法可以加快这个过程吗?也许将这个脚本转移到 Python 的整个想法毫无意义?在其他操作中,Python 更快(即处理字符串),一旦需要处理数据帧,在两个或多个脚本之间跳转会非常不方便。请问这方面有什么帮助吗?
更新 真正的脚本块迭代初始数据帧的行(相当大,500-1500k 行)并创建一个新的行,其中包含来自原始列“code1”的值和对应于另一个数据帧的代码,以及许多其他值,是新创建的。我相信,我可以用图片澄清它:
稍后在脚本中,我还需要根据不同的条件在循环中搜索特定值。因此,搜索速度至关重要。
【问题讨论】:
-
这张图不只是描绘合并吗?
-
您实际上可以通过这张图片@ifly6 这么说,但它是所做工作的简化(也许不是最好的)图形表示。计算是按行进行的,下一行通常(但并非总是)取决于先前的值和/或代码,因此在合并时非常不可预测。我对其他值没有问题,但搜索其他代码很慢,我想针对当前和进一步的任务改进这一点
-
好吧,图片并没有让它更清楚,但从你的评论看来你确实需要做一个
join,也许有些人应用一些rolling的东西,到结果。
标签: python r pandas dataframe filtering