将.rda文件转换为pandas数据框架

16

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

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是一个pandas数据帧。但它只包含了.rda文件的标题!我已经前后搜索过了,没有一个提出的解决方案似乎起作用。

有人有什么好办法可以高效地将.rda数据框转换为pandas数据框吗?


1
尝试从R中保存.rds(单个对象)文件。 - Parfait
谢谢您的提议。然而,我无法控制.rda文件的生成,并在使用Python加载它们之前将其转换为.rds格式将极其低效。还有其他建议吗? - Matina G
其实不用太麻烦,只需要在R环境中加载.rda文件,然后运行'eapply'或'mget'命令,就可以将每个全局环境对象保存为个别的rds文件。 - Parfait
3个回答

14
感谢您的有用问题。我尝试了上述提出的两种方法来解决我的问题。 对于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,有什么解决方法吗? - Marc Maxmeister
嗨@MarcMaxmeister,能分享一下这个文件吗?实际上,那个包还有一些限制:https://github.com/ofajardo/pyreadr。我从这个仓库中转换了`rda`文件:https://github.com/clauswilke/dviz.supp/tree/master/data,它运行得相当不错(48个中有41个成功转换)。我的转换文件已保存为`tsv`格式,链接在这里:https://github.com/nguyenhoa93/data-visualization-practice/tree/master/data/resources。 - Hoa Nguyen
.rda文件太大了,无法共享。我认为是几个GB的大小。这是一个已停用的R库使用的基因组数据库。 - Marc Maxmeister
1
我找到了一个解决方法 - 我必须安装R,然后保存为feather格式,最后在Python Pandas中使用from_feather加载。 - Marc Maxmeister
注意:如果有兴趣在Arrow中使用rpy2,请参考此链接 - https://github.com/rpy2/rpy2-arrow - lgautier
1
尽管pyreadr包有点过时,但该解决方案仍然有效。 - Ashok K Harnal

5

如前所述,考虑使用R的mget或eapply将.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())

1
为什么需要将其写出为rds并重新加载?我对rpy2还不熟悉,但在您的“python combined”代码中,似乎可以运行到dfList = base.mget(base.ls())这一行。然后使用一个for循环遍历base.names(dfList)的元素,使用命令df_dict[i] = pandas2ri.ri2py_dataframe(robjects.globalenv[i])来填充df_dict。至少,这对我来说是有效的... - Nick
@Nick,你说得很对。鉴于这个提问已经五个月了,回答可以简化一下,不用将.rds保存到磁盘上。我想我被细节问题搞糊涂了,没有看到整个情况。事后诸葛亮嘛,总是容易的。 - Parfait
在rpy2版本3.0.3中,似乎已经不存在pandas2ri.ri2py_dataframe - 0range

5
你可以尝试使用新的feather库,它是一种语言无关的数据框架,可在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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接