我在Pandas中有一个数据框,我想使用R函数对其进行一些统计。没问题! RPy使从Pandas向R发送数据帧变得容易:

import pandas as pd
df = pd.DataFrame(index=range(100000),columns=range(100))
from rpy2 import robjects as ro
ro.globalenv['df'] = df

如果我们在IPython中:
%load_ext rmagic
%R -i df

出于某种原因,ro.globalenv路由比rmagic路由稍慢,但是没关系。重要的是:我最终将使用的数据帧约为100GB。这带来了一些问题:
  • 即使只有1GB的数据,传输速度也相当慢。
  • 如果我理解正确,那么它将在内存中创建数据帧的两个副本:一个在Python中,一个在R中。这意味着我的内存需求将增加一倍,甚至还没有运行统计测试!

  • 有什么办法可以:
  • 可以更快地在Python和R之间传输大型数据帧吗?
  • 访问内存中的同一对象?我怀疑这是要月亮。
  • 最佳答案

    rpy2正在使用一种转换机制,该机制试图避免在Python和R之间移动时复制对象。但是,当前仅在R-> Python方向上有效。

    Python的rpy2使用了一个称为“缓冲区接口(interface)”的接口(interface),该接口(interface)使R和Python之间的C级兼容的副本数减至最少(请参阅http://rpy.sourceforge.net/rpy2/doc-2.5/html/numpy.html#from-rpy2-to-numpy-该文档似乎已过时,因为__array_struct__接口(interface)已不再主要选择)。

    R中没有等效的缓冲区接口(interface),而目前困扰我而无法在rpy2中提供等效功能的原因是,在垃圾回收期间处理借用的引用(并且缺乏足够的时间对其进行仔细地思考)。

    因此,总而言之,有一种方法可以在Python和R之间共享数据而不进行复制,但这需要在R中创建数据。

    关于python - 使用RPy(或其他方式)*高效**将数据帧从 Pandas 移动到R,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30011910/

    10-12 17:50
    查看更多