我在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。这提出了一些问题:
有没有办法:
答案 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之间数据交换的最有效选择。