在 Pandas 中加载 .rds 文件

Posted

技术标签:

【中文标题】在 Pandas 中加载 .rds 文件【英文标题】:Loading a .rds file in Pandas 【发布时间】:2017-04-21 03:21:40 【问题描述】:

我下载了一个 .rds 格式的文件,如何使用 Pandas 加载它?它应该是一个 R 文件,但我找不到任何有关如何加载它的信息。

【问题讨论】:

你看过pandas rpy2 R 界面吗? pandas.pydata.org/pandas-docs/stable/r_interface.html 【参考方案1】:

对我来说,同时使用 pyreadrrpy2 失败了,因为我的 rds 文件不是这两个文件所期望的格式。在使用pyreadr 阅读时,我不断收到错误ValueError: If using all scalar values, you must pass an indexrpy2 和空对象。我的 rds 文件在两个列表中有数据,因此这些选项不起作用。最后,我在 R 中编写了以下几行代码以将结果保存为 CSV:

#load data
data = readRDS("inputData.rds")
D = list()
D[[1]] = data[[1]]
D[[2]] = data[[2]]

write.csv(D[[1]],file="first.csv")
write.csv(D[[2]],file="first_1.csv")

我希望遇到类似问题的人会觉得这很有帮助。

【讨论】:

pyreadr 不读取 R 列表。另一种选择是将您的数据帧独立保存在 RData 文件中,然后您将能够使用 pyreadr 读取两者【参考方案2】:

为了跟进@mgalardini 的回答,在较新版本的 rpy2(版本 3.0.4)中,将 R 数据帧转换为 pandas 数据帧的方法发生了变化:

>>> rpy2.__version__
'3.0.4'
>>> import rpy2.robjects as robjects
>>> from rpy2.robjects import pandas2ri
>>> readRDS = robjects.r['readRDS']
>>> df = readRDS('my_file.rds')
>>> df = pandas2ri.rpy2py_dataframe(df)

【讨论】:

返回错误ModuleNotFoundError: No module named 'tzlocal' pip install tzlocal 我得到:AttributeError: 'ListVector' 对象没有属性 'rownames' 使用 df = readRDS('d:/src/ISLR/data/Rdata.rds') df = pandas2ri.rpy2py_dataframe(df ) 其中数据来自cran.r-project.org/bin/windows/contrib/4.0/ISLR_1.2.zip。有什么问题?谢谢。【参考方案3】:

如果您不想安装 R(rpy2 需要它),有一个新包“pyreadr”可以非常轻松地读取 Rds 和 RData 文件。

它是 C 库 librdata 的包装器,因此速度非常快。

您可以使用 pip 轻松安装:

pip install pyreadr

然后你就可以读取你的rds文件了:

import pyreadr

result = pyreadr.read_r('/path/to/file.Rds') # also works for RData

# done! 
# result is a dictionary where keys are the name of objects and the values python
# objects. In the case of Rds there is only one object with None as key
df = result[None] # extract the pandas data frame 

repo 在这里:https://github.com/ofajardo/pyreadr

免责声明:我是这个包的开发者。

【讨论】:

Sphafiles 是具有嵌套对象的数据框。 Librdata,pyreadr 背后的 C 库目前不支持读取嵌套对象。此外,这些嵌套对象似乎是列表,而 librdata 目前无法读取列表。由于这些原因,pyreadr 无法读取形状文件或其他具有类似复杂结构的文件。 检查 dll 是否在 windows 路径中。例如,参见github.com/Roche/pyreadstat/issues/33。如果问题仍然存在,请在 github 上打开一个问题。 感谢这个包,但是当我使用这个包时,它会将我的几个字符列转换为列表,对于这个特定问题有一些解决方案,为什么会发生这种情况?结果 = pyreadr.read_r('XYZ.RData') DF_XYZ = 结果['MYDATA'] 如需报告错误,请使用 github repo 中的问题跟踪器。请附上样本文件。我需要能够重现该问题,否则我无法修复它。 @OttoFajardo 我在尝试读取 rds 文件时收到错误 LibrdataError: Invalid file, or file has unsupported features。我已经研究了这个问题,但我无法找到解决方案。你以前有过这个问题吗?【参考方案4】:

您可以通过以下方式使用the rpy2 interface to Pandas:

import rpy2.robjects as robjects
from rpy2.robjects import pandas2ri
pandas2ri.activate()

readRDS = robjects.r['readRDS']
df = readRDS('my_file.rds')
df = pandas2ri.ri2py(df)
# do something with the dataframe

【讨论】:

对于我的文件,这将返回一个robjects.vectors.ListVector。如何访问列表项?

以上是关于在 Pandas 中加载 .rds 文件的主要内容,如果未能解决你的问题,请参考以下文章

pandas 是不是读取完整的数据文件并将其存储在数据框中?在 pandas 中加载 100mb 文件是不是有效?

无法使用熊猫在 python3 中加载 csv 文件

无法在python中加载json文件[重复]

python pandas 中文件的读写——read_csv()读取文件

使用Python从rds上下载mysql备份文件

Numpy Genfromtxt 比 pandas read_csv 慢