如何将R数据帧导入Pandas?

时间:2014-03-29 18:38:46

标签: python r import pandas dataframe

我正在使用R off作为Python的“后端”,因此需要偶尔将R中的数据帧导入Python;但我无法弄清楚如何将R data.frame导入为Pandas DataFrame

例如,如果我在R

中创建数据框
rdf = data.frame(a=c(2, 3, 5), b=c("aa", "bb", "cc"), c=c(TRUE, FALSE, TRUE))

然后使用rmagic

将其拉入Python
%Rpull -d rdf

我得到了

array([(2.0, 1, 1), (3.0, 2, 0), (5.0, 3, 1)], 
      dtype=[('a', '<f8'), ('b', '<i4'), ('c', '<i4')])

我不知道这是什么,而且肯定不是

pd.DataFrame({'a': [2, 3, 5], 'b': ['aa', 'bb', 'cc'], 'c': [True, False, True]})

我期待。

唯一能为我工作的是使用文件通过写入R来传输数据框

write.csv(data.frame(a=c(2, 3, 5), b=c("aa", "bb", "cc"), c=c(TRUE, FALSE, TRUE)), file="TEST.csv")

然后用Python阅读

pd.read_csv("TEST.csv")

虽然这种方法甚至会产生一个额外的列:“未命名:0”。

将R数据帧作为Pandas数据帧导入Python的惯用法是什么?

2 个答案:

答案 0 :(得分:6)

首先:array([(2.0, 1, 1), (3.0, 2, 0), (5.0, 3, 1)], dtype=[('a', '<f8'), ('b', '<i4'), ('c', '<i4')])。这是一个numpy结构arrayhttp://docs.scipy.org/doc/numpy/user/basics.rec.html/。您可以使用pandas

轻松将其转换为pd.DataFrame DF
In [65]:

from numpy import *
print pd.DataFrame(array([(2.0, 1, 1), (3.0, 2, 0), (5.0, 3, 1)], dtype=[('a', '<f8'), ('b', '<i4'), ('c', '<i4')]))
   a  b  c
0  2  1  1
1  3  2  0
2  5  3  1

b列经过编码(就像factor()中的R一样),c列已从boolean转换为{{1 }}。 int已从a转换为intfloat,实际上我发现这意外了)

第二,我认为'<f8'是从pandas.rpy.common获取数据的最便捷方式:http://pandas.pydata.org/pandas-docs/stable/r_interface.html(可能过于简短,所以我将在此处添加另一个示例):

R

最后,In [71]: import pandas.rpy.common as com DF=pd.DataFrame({'val':[1,1,1,2,2,3,3]}) r_DF = com.convert_to_r_dataframe(DF) print pd.DataFrame(com.convert_robj(r_DF)) val 0 1 1 1 2 1 3 2 4 2 5 3 6 3 列是索引列。您可以通过向Unnamed: 0

提供index_col=0来避免这种情况

答案 1 :(得分:2)

这个(see pandas 0.13.1 documentation):

%load_ext rmagic
%R rdf = data.frame(a=c(2, 3, 5), b=c("aa", "bb", "cc"), c=c(TRUE, FALSE, TRUE))

import pandas.rpy.common as com

print com.load_data('rdf')
   a   b      c
1  2  aa   True
2  3  bb  False
3  5  cc   True