【问题标题】:converting .rda to pandas dataframe将 .rda 转换为 pandas 数据框
【发布时间】:2018-05-29 17:50:37
【问题描述】:

我有一些需要用 Python 访问的 .rda 文件。 我的代码如下所示:

import rpy2.robjects as robjects
from rpy2.robjects import r, pandas2ri

pandas2ri.activate()
df = robjects.r.load("datafile.rda")
df2 = pandas2ri.ri2py_dataframe(df)

其中 df2 是熊猫数据框。但是,它只包含.rda 文件的标题!我来回搜索过。所提出的解决方案似乎都不起作用。

有人知道如何有效地将.rda 数据帧转换为熊猫数据帧吗?

【问题讨论】:

  • 尝试从 R an .rds (single object) 文件中保存。
  • 感谢您的提议。但是,我无法控制 .rda 文件的 le 生成,并且在使用 python 加载它们之前将它们转换为 .rds 将非常低效。还有其他建议吗?
  • 其实不然,只需在 R 环境中加载 .rda 文件并运行 eapplymget 即可将每个全局环境对象保存到单独的 rds 文件中。

标签: python r rpy2


【解决方案1】:

感谢您提出有用的问题。我尝试了上面提出的两种方法来处理我的问题。 对于feather,我遇到了这个问题:

pyarrow.lib.ArrowInvalid: Not a Feather V1 or Arrow IPC file

对于rpy2,正如@Orange 所述:“pandas2ri.ri2py_dataframe 在 rpy2 版本 3.0.3 或更高版本中似乎不再存在。

我搜索了另一种解决方法,发现 pyreadr 对我有用,也许对那些与我面临同样问题的人有用:https://github.com/ofajardo/pyreadr

用法https://gist.github.com/LeiG/8094753a6cc7907c716f#gistcomment-2795790

pip install pyreadr
import pyreadr

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

# done! let's see what we got
# result is a dictionary where keys are the name of objects and the values python
# objects
print(result.keys()) # let's check what objects we got
df1 = result["df1"] # extract the pandas data frame for object df1

【讨论】:

  • 我在.rda 文件上尝试了这个并得到了这个错误:pyreadr.custom_errors.LibrdataError: The file is compressed using an unsupported compression scheme -- 任何解决方法?
  • 嗨@MarcMaxmeister,可以共享文件吗?实际上,该软件包仍有一些限制:github.com/ofajardo/pyreadr。我从这个存储库转换了rda 文件:github.com/clauswilke/dviz.supp/tree/master/data,它工作得很好(48 个中有 41 个被成功转换)。我转换后的文件在此处保存为tsv 格式:github.com/nguyenhoa93/data-visualization-practice/tree/master/…
  • .rda 文件太大,无法共享。我认为千兆字节。它是一个已失效的 R 库使用的基因组学数据库。
  • 我找到了解决办法——我必须安装 R,然后保存到羽毛,然后在 python Pandas 中加载 from_feather
  • 注意:如果有兴趣将 rpy2 与 Arrow 一起使用,有这个 - github.com/rpy2/rpy2-arrow
【解决方案2】:

您可以尝试使用新的feather library 开发为与语言无关的数据框,可在 R 或 Python 中使用。

# Install feather
devtools::install_github("wesm/feather/R")

library(feather)
path <- "your_file_path"
write_feather(datafile, path)

然后在python中安装

$ pip install feather-format

并加载到您的数据文件中

import feather
path = 'your_file_path'
datafile = feather.read_dataframe(path)

【讨论】:

    【解决方案3】:

    如前所述,考虑使用 R 的 mgeteapply 将 .rda 文件转换为单独的 .rds 对象,以构建 Python 数据帧字典。

    RPy2

    import os
    import pandas as pd
    
    import rpy2.robjects as robjects
    from rpy2.robjects import pandas2ri    
    from rpy2.robjects.packages import importr
    
    pandas2ri.activate()
    
    base = importr('base')
    base.load("datafile.rda")    
    rdf_List = base.mget(base.ls())
    
    # ITERATE THROUGH LIST OF R DFs 
    pydf_dict = {}
    
    for i,f in enumerate(base.names(rdf_List)):
        pydf_dict[f] = pandas2ri.ri2py_dataframe(rdf_List[i])
    
    for k,v in pydf_dict.items():
        print(v.head())
    

    【讨论】:

    • 为什么需要写成 rds 再加载回来?我是 rpy2 的新手,但在您的“python 组合”代码中,您似乎可以将它运行到 dfList = base.mget(base.ls()) 行。然后在base.names(dfList) 的元素上使用for 循环以使用命令df_dict[i] = pandas2ri.ri2py_dataframe(robjects.globalenv[i]) 填充df_dict。至少,这似乎对我有用......
    • 你实际上是对的,@Nick。给定五个月大的问题,可以在不将 .rds 保存到磁盘的情况下简化答案。我想我陷入了杂草之中,没有看到全貌。事后诸葛亮总是 20-20 对吗?
    • pandas2ri.ri2py_dataframe 在 rpy2 版本 3.0.3 中似乎不再存在。
    猜你喜欢
    • 2020-06-12
    • 2019-05-14
    • 1970-01-01
    • 2014-08-19
    • 2019-07-01
    • 2021-12-13
    • 2020-07-28
    • 2018-03-25
    • 1970-01-01
    相关资源
    最近更新 更多