如何将R数据框导入Pandas?

5
我作为 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")

尽管这种方法会产生一个额外的列:"Unnamed: 0"。
将R数据框导入Python作为Pandas数据框的惯用语是什么?

可能是重复的问题:Pandas - 如何将R数据框转换回Pandas? - joris
请参考@lgautier的评论:http://stackoverflow.com/questions/15209636/convert-to-r-dataframe-module-object-has-no-attribute#comment21457740_15209636 - joris
@joris:不是重复的问题。仔细看看这个问题。这是关于在R中创建的数据框的问题。 - orome
2个回答

6

首先:array([(2.0, 1, 1), (3.0, 2, 0), (5.0, 3, 1)], dtype=[('a', '<f8'), ('b', '<i4'), ('c', '<i4')])是一个numpy结构化的数组http://docs.scipy.org/doc/numpy/user/basics.rec.html/。你可以使用pd.DataFrame轻松地将其转换为pandas 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已被编码(就像在R中使用factor()),列cboolean转换为int列aint转换为float(实际上我发现这是意外的,类型为'<f8')。
其次,我认为pandas.rpy.common是从R获取数据的最便捷方式:http://pandas.pydata.org/pandas-docs/stable/r_interface.html(可能太简要了,所以我在这里添加另一个例子):
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列是索引列。您可以通过在pd.read_csv()中提供index_col=0来避免它。


第二种方法与第一种方法没有任何区别——即用pd.DataFrame(com.convert_robj(rdf))包装与使用pd.DataFrame(rdf)没有区别。第一种方法会以奇怪的方式更改所有值。看起来文件导出/导入方法是唯一可行的方法? - orome
还有,感谢您提供的 index_col=0 小贴士。这绝对是导入/导出的首选方法,除非我漏掉了什么。 - orome
你是对的,我发现保留string数据类型的唯一方法是 %R z = c('a',1,'c') 然后 %Rpull z。将其放入 data.frame 中总是会导致它被转换为 int32/64。值得一提的是,在我的机器上,第二种方法与第一种方法略有不同,因为生成的 DataFrame 的所有列都是 int64,而不是混合的 dtypes - CT Zhu
1
对于最后一个,你也可以在 R 中使用 write.csv(......, row.names=FALSE) 代替。 - CT Zhu

2
这个怎么样(请参阅pandas 0.13.1文档:将R数据集转换为Python):
%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

rdf是您的R数据框,rdf = data.frame(a=c(2, 3, 5), b=c("aa", "bb", "cc"), c=c(TRUE, FALSE, TRUE))。 - masat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接