【问题标题】:Can I use rpy2 to save a pandas dataframe to an .Rdata file?我可以使用 rpy2 将 pandas 数据框保存到 .Rdata 文件吗?
【发布时间】:2013-02-11 11:24:44
【问题描述】:

我以前从未使用过 rpy2,但我只是想知道是否可以使用它将 python 对象(pandas DataFrame)保存在 R 可读文件中。我无法在这些环境之间移动对象,主要是因为我使用的是 Windows 并且数据源是 Excel 文件。是的,那种单元格包含文本,包括引号、换行符以及 CSV 无法充分处理的所有内容。

我通常依赖 XLConnectJars,但它似乎坏了

Installing package(s) into ‘C:/Program Files/R/library’
(as ‘lib’ is unspecified)
trying URL 'http://cran.csiro.au/bin/windows/contrib/2.15/XLConnectJars_0.2-4.zip'
Content type 'application/zip' length 16538311 bytes (15.8 Mb)
opened URL
downloaded 15.3 Mb

Warning in install.packages :
  downloaded length 16011264 != reported length 16538311

pandas 正确读取,但我需要使用 R 中的信息。

【问题讨论】:

  • 警告不是错误。该软件包很可能仍然有效(我间歇性地收到此警告,没有任何实际问题)
  • @mnel 失败并出现错误:找到了“包‘XLConnectJars’0.2-0,但‘XLConnect’需要== 0.2.4”

标签: python r pandas


【解决方案1】:

您可以使用 rpy2 来执行此操作。一旦你在 Pandas 中获得数据,你必须将其传输到 R。This link 提供了 Python Pandas 和 R data.frames 之间的实验接口。从网站复制的代码示例:

from pandas import DataFrame
import pandas.rpy.common as com

df = DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C':[7,8,9]},
                index=["one", "two", "three"])
r_dataframe = com.convert_to_r_dataframe(df)

print type(r_dataframe)
 <class 'rpy2.robjects.vectors.DataFrame'>

print r_dataframe
      A B C
one   1 4 7
two   2 5 8
three 3 6 9

【讨论】:

  • 那么你将如何将这个data.frame 写入.RData 文件?
  • 使用save函数。
  • 来自 Panda 文档:Up to pandas 0.19, a pandas.rpy module existed with functionality to convert between pandas and rpy2 objects. This functionality now lives in the rpy2 project itself. See the updating section of the previous documentation for a guide to port your code from the removed pandas.rpy to rpy2 functions.
【解决方案2】:

以下是使用rpy2 写入/读取.RData 文件的方法(因为已弃用已接受的解决方案并且未显示如何保存到.RData 文件):

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

# read .RData file as a pandas dataframe
def load_rdata_file(filename):
    r_data = robjects.r['get'](robjects.r['load'](filename))
    df = pandas2ri.ri2py(r_data)
    return df

# write pandas dataframe to an .RData file
def save_rdata_file(df, filename):
    r_data = pandas2ri.py2ri(df)
    robjects.r.assign("my_df", r_data)
    robjects.r("save(my_df, file='{}')".format(filename))

【讨论】:

  • 我正在尝试将 pandas df 写入 rda 文件。我遵循了这个过程,但由于某种原因,它添加了列。我原来的 df 有 92 列,当我在 R 中打开它时,它有 1942 列。它们是从另一列的值创建的(即,如果列名称为 A,则我有 A.1、A.2、A.3 等填充原始 A 列中的单个值)。接受任何和所有建议。
【解决方案3】:

使用最新版本的rpy2,版本 3.3.2,我无法获得其他答案。现在看来,转换的工作方式有点不同。

import pandas
p_df = pandas.DataFrame(data={'col1': [1, 2], 'col2': [3, 4]})

以下代码会将上述 pandas 数据帧转换为 R 数据帧,并将 R 数据帧保存为 R .rds 文件。

from rpy2 import robjects
from rpy2.robjects import pandas2ri
from rpy2.robjects.conversion import localconverter

# Convert pandas dataframe to R dataframe
with localconverter(robjects.default_converter + pandas2ri.converter):
    r_df = robjects.conversion.py2rpy(p_df)

# Save R dataframe as .rds file
r_file = "file.rds"
robjects.r.assign("my_df_tosave", r_df)
robjects.r(f"saveRDS(my_df_tosave, file='{r_file}')")

以下代码将加载 .rds 文件并将其转换回 pandas 数据帧。

# Load as R dataframe from .rds file
r_file = "file.rds"
robjects.r(f"df_to_load <- readRDS('{r_file}')") 
r_df = robjects.r["df_to_load"]

# Convert R dataframe to pandas dataframe
with localconverter(robjects.default_converter + pandas2ri.converter):
    p_df = robjects.conversion.rpy2py(r_df)

【讨论】:

  • 知道如何在保存时添加r_file 的路径吗?添加一个时出现以下错误:ParsingError: Parsing status not OK - PARSING_STATUS.PARSE_NULL。否则工作正常!
  • 保存时添加路径可以r_file=myfolder/file.rds。 @Jossy 我刚刚对此进行了测试,它对我有用-您是否有一个最小的工作示例来显示您收到的错误消息?
  • 嘿。感谢回复。 r_file = r"C:\Users\Philip\test2.rds"。和你的代码一样。只需一个文件名即可正常工作。添加路径会出现PARSING 错误...
  • 刚刚测试过r_file = "C:/Users/Philip/test2.rds",它工作正常!感谢您推动我进行更多测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 2013-11-26
  • 2015-07-26
  • 2017-12-26
  • 2022-01-24
  • 2015-10-26
相关资源
最近更新 更多