*使用RPy(或其他方式)有效地将数据帧从Pandas移动到R

时间:2015-05-03 08:51:18

标签: python r dataframe rpy2

我在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。这提出了一些问题:

  1. 即使只有1GB的数据,传输速度也相当慢。
  2. 如果我理解正确的话,这会在内存中创建两个数据帧副本:一个在Python中,一个在R中。这意味着我的内存需求只增加了一倍,我甚至没有得到运行统计测试!
  3. 有没有办法:

    1. 更快地在Python和R之间传输大型数据帧?
    2. 访问内存中的同一个对象?我怀疑这要求登月。

2 个答案:

答案 0 :(得分:5)

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

Python有一个名为“缓冲区接口”的接口,由rpy2使用,它可以最大限度地减少R和Python之间兼容的C级副本的数量(参见http://rpy.sourceforge.net/rpy2/doc-2.5/html/numpy.html#from-rpy2-to-numpy - doc似乎已过时,因为__array_struct__接口不再是主要选择。)

R中没有与缓冲区接口等效的内容,当前的问题阻碍了我在rpy2中提供等效功能的原因是在垃圾收集过程中处理借用的引用(并且没有足够的时间去思考小心一点)。

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

答案 1 :(得分:3)

目前,feather似乎是R和Pandas的DataFrame之间数据交换的最有效选择。