在 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】:对我来说,同时使用 pyreadr
和 rpy2
失败了,因为我的 rds 文件不是这两个文件所期望的格式。在使用pyreadr
阅读时,我不断收到错误ValueError: If using all scalar values, you must pass an index
和rpy2
和空对象。我的 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 文件是不是有效?