使用Rpy2将Pandas DataFrame转换为R dataframe

11

我有一个pandas数据帧,我使用pandas.rpy.common中的convert_to_r_dataframe方法将其转换为R数据框。 我已经设置好如下:

self.event = pd.read_csv('C://' + self.event_var.get() + '.csv')
final_products = pd.DataFrame({'Product': self.event.Product, 'Size': self.event.Size, 'Order': self.event.Order})
r.assign('final_products', com.convert_to_r_dataframe(final_products))
r.assign('EventName', self.event_var.get())
r.assign('EventTime', self.eventtime_var.get())
r.source('application.r')

self.event_var.get() 从GUI中检索用户输入(我正在使用Tkinter创建应用程序)。Product、Size和Order是CSV文件中的列。

由于Rpy2在Python中设置了R环境,我期望最终的 final_products R 数据框将被R环境理解。不幸的是,虽然R脚本确实运行了,但它并没有给出正确的结果(我使用R脚本创建图形,但它们在程序终止时为空)。然而,EventName和EventTime变量确实有效。我在这里错过了什么吗?为什么Python中的R数据框分配没有被R环境正确解释?

获得的错误:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python27\lib\lib-tk\Tkinter.py", line 1470, in __call__
    return self.func(*args)
File "G:\Development\workspace\GUI\GUI.py", line 126, in evaluate
    r.source('application.r')
File "C:\Python27\lib\site-packages\rpy2\robjects\functions.py", line 86, in __call__
    return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
File "C:\Python27\lib\site-packages\rpy2\robjects\functions.py", line 35, in __call__
    res = super(Function, self).__call__(*new_args, **new_kwargs)

在赋值之前,你能打印出 final_products 的类型吗? - Mittenchops
2个回答

9

很好的回答 @Mittenchops。由于convert_to_r_dataframe已经被弃用,因此需要使用rpy2接口更新上面的示例。

from rpy2.robjects import pandas2ri
pandas2ri.activate()

import pandas as pd
import numpy as np
from datetime import datetime
n = 10
df = pd.DataFrame({
    "timestamp": [datetime.now() for t in range(n)],
    "value": np.random.uniform(-1, 1, n)
})
r_dataframe = pandas2ri.py2ri(df)
print(r_dataframe)

2
pandas2ri.py2rpy_pandasdataframe(df) 对我有效。 - alejandro

3
很遗憾,这将是困难的,因为Python转换为R 比以前更好, 但并不完美,而且目前在Windows上仍然很困难, 而你似乎正在使用Windows。
这有点像一个hack,但作为解决方法,您可以在将pd.DataFrame分配给变量之前设置名称和时间变量before,然后再将DataFrame转换为R。
一旦它在R中,您将需要使用R函数来操作数据框,而不是您的python函数——甚至您的getter和setter也需要以更类似于以下方式传递到R环境中:
myfunct = robjects.r('''
        f <- function(r, verbose=FALSE) {
            if (verbose) {
                cat("I am calling f().\n")
            }
            2 * pi * r
        }
        f(3)
        ''')

来自这里

但是,为了检查您的数据框是否被正确转换,您可以通过运行以下命令开始调试:

import pandas as pd
import numpy as np
import pandas.rpy.common as com
from datetime import datetime

n = 10
df = pd.DataFrame({
    "timestamp": [datetime.now() for t in range(n)],
    "value": np.random.uniform(-1, 1, n)
    })

r_dataframe = com.convert_to_r_dataframe(df)
print(r_dataframe)

这是否会产生类似于数据框的R打印语句的输出,如下所示

>>>             timestamp        value
0 2014-06-03 15:02:20 -0.36672....
1 2014-06-03 15:02:20 -0.89136....
2 2014-06-03 15:02:20 0.509215....
3 2014-06-03 15:02:20 0.862909....
4 2014-06-03 15:02:20 0.389879....
5 2014-06-03 15:02:20 -0.80607....
6 2014-06-03 15:02:20 -0.97116....
7 2014-06-03 15:02:20 0.376419....
8 2014-06-03 15:02:20 0.848243....
9 2014-06-03 15:02:20 0.446798....

这里这里中提取的示例。


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