【问题标题】:Converting a Pandas DataFrame to R dataframe using Rpy2使用 Rpy2 将 Pandas 数据帧转换为 R 数据帧
【发布时间】:2014-04-15 01:01:48
【问题描述】:

我有一个 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 环境,我希望 R 环境能够理解 final_products R 数据帧。不幸的是,虽然 R 脚本确实运行了,但它并没有给出正确的结果(我使用 R 脚本创建了图表,但是当程序终止时它们只是空的)。但是,EventName 和 EventTime 变量确实有效。我在这里缺少什么吗?关于为什么 R 环境没有正确解释 Python 中的 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的类型吗?

标签: python r dataframe rpy2


【解决方案1】:

很好的答案 @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】:

    不幸的是,这会很困难,因为 Python -> R 转换 is better than it used to be,但并不完美,而 is still hard on Windows currently,看起来你正在使用。

    这有点小技巧,但作为一种变通方法,您可以尝试在分配 pd.DataFrame 时设置名称和时间变量将 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)
            ''')
    

    来自here

    但首先要检查您的 DataFrame 是否正确转换,您可以通过运行以下命令开始调试:

    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....
    

    herehere 剥离的示例。

    【讨论】:

      猜你喜欢
      • 2017-02-04
      • 1970-01-01
      • 2015-09-08
      • 2018-09-22
      • 2019-07-08
      • 1970-01-01
      • 2021-11-16
      • 2016-09-27
      相关资源
      最近更新 更多