问题 在R中读取pickle文件(PANDAS Python Data Frame)


有没有一种简单的方法可以将Pandas Dataframe中的pickle文件(.pkl)读入R?

一种可能性是导出到CSV并让R读取CSV但这对我来说似乎非常麻烦,因为我的数据帧相当大。有更简单的方法吗?

谢谢!


12582
2018-02-01 00:13


起源

你也可以看看 fread 来自 data.table 包。它读取csv文件的速度比基本R快得多(这实际上很慢)。使用150 MB csv文件进行快速测试显示11秒 read.csv 用2秒钟 fread。 - Laterow
为什么不直接存储在像SQLite这样的数据库中,R和Python都可以读/写?实际上,RDMS的目的是作为最终使用程序的中央存储库。 - Parfait
@Parfait如果数据很大,将数据存储到RDMS中,特别是将其序列化为R将会(相对较慢)。只是我的观察结果:这种操作的RDMS速度。根据我的经验,在大多数情况下使用大型数据集时,Laterrow和我的回答中提到的流式传输将变得更快。使用rpy2可能会比流式传输慢 - 但它具有保持数据结构化的优势(如RDMS)。 - russellpierce


答案:


你可以在python中加载pickle,然后通过python包将它导出到R. rpy2 (或类似的)。完成后,您的数据将存在于链接到python的R会话中。我怀疑你接下来要做的就是使用该会话来调用R并将saveRDS调用到文件或RAM磁盘。然后在RStudio中,您可以重新读取该文件。查看R包 rJython 和 rPython 从哪些方法可以从R触发python命令

或者,您可以编写一个简单的python脚本来加载Python中的数据(可能使用上面提到的R包之一)并将格式化的数据流写入stdout。然后整个系统调用脚本(包括指定你的pickle的参数)可以用作参数 fread 在R包中 data.table。或者,如果您想保持标准功能,可以使用组合 system(..., intern=TRUE) 和 read.table

像往常一样,有很多/很多方法可以给这只特别的猫上皮。基本步骤是:

  1. 在python中加载数据
  2. 将数据表示为R(例如,通过rpy2导出对象或将格式化文本写入stdout,R准备好在另一端接收它)
  3. 将R中表达的数据序列化为内部数据表示(例如,通过rpy2或rx2导出对象) fread
  4. (可选)使R会话中的数据可以访问另一个R会话(即,使用rpy2关闭循环的步骤,或者如果您一直在使用 fread 那你已经完成了)。

6
2018-02-01 00:20



有意思,谢谢!我将如何进行出口 r_dataframe 然后打开它说,Rstudio? - Vincent
我扩展了你的选择。 - russellpierce
附:使用{reticulate}这样可以更容易地完全从R端进行管理......并且在RStudio中工作得特别好。 - russellpierce


网纹 正如russellpierce在评论中所建议的那样,非常容易和超级流畅。

install.packages('reticulate')

之后,我从他们的文档中给出的示例创建了这样的Python脚本。

Python文件:

import pandas as pd

def read_pickle_file(file):
    pickle_data = pd.read_pickle(file)
    return pickle_data

然后我的R文件看起来像:

require("reticulate")

source_python("pickle_reader.py")
pickle_data <- read_pickle_file("C:/tsa/dataset.pickle")

这给了我早先以pickle格式存储的所有R数据。


3
2017-07-17 08:13