我已经处理了一个R数据框:
import rpy2.robjects as ro
from rpy2.robjects.packages import importr
from rpy2.robjects import pandas2ri
from rpy2.robjects.conversion import localconverter
pandas2ri.activate()
import pandas as pd
%%R
n = c(2, 3, 5)
s = c("aa", "bb", "cc")
b = c(TRUE, FALSE, TRUE)
r_df = data.frame(n, s, b)
r_df[['c']]=NA
r_df
#out:
# n s b c
#1 2 aa 1 NA
#2 3 bb 0 NA
#3 5 cc 1 NA
当我将其转换为熊猫时,它将NA
替换为整数。
with localconverter(ro.default_converter + pandas2ri.converter):
pd_from_r_df = ro.conversion.rpy2py(ro.r('r_df'))
pd_from_r_df
#Out:
# n s b c
#1 2.0 aa 1 -2147483648
#2 3.0 bb 0 -2147483648
#3 5.0 cc 1 -2147483648
我尝试在r_df
的列中设置不同的数据类型,但无济于事。我该如何解决这个问题?
请注意,在转换为熊猫之前设置r_df[is.na(r_df)]='None'
可解决此问题。但这应该比这简单
答案 0 :(得分:2)
可能的问题是R对于布尔值(R语言中的“逻辑向量”)和整数值具有“ NA”值,而Python / numpy没有。
看看下面两个示例中dtype
的变化方式:
In [1]: import pandas
In [2]: pandas.Series([True, False, True])
Out[2]:
0 True
1 False
2 True
dtype: bool
In [3]: pandas.Series([True, False, None])
Out[3]:
0 True
1 False
2 None
dtype: object
这里发生的是您的R数据帧中的列“ c”的类型为“逻辑”(LGLSXP
),但是在C中,这是一个整数数组,它仅使用0、1中的一个和-2147483648(分别用于FALSE
,TRUE
和NA
)。 rpy2转换器将转换为整数的numpy
向量,因为:
rpy2
实现了numpy array interface,以允许在两种语言中匹配C数组。numpy
使用该界面(numpy.array()
is called by rpy2
)诚然,这只是进行转换的方法之一,在某些情况下这不是最方便的。使用自定义转换器可以获取更适合您的行为。
PS:以下有关您的解决方法的另一条注意事项
请注意,在转换为熊猫之前,设置r_df [is.na(r_df)] ='None' 解决了这个问题。但这应该比这简单
这里发生的是,您正在将R布尔向量转换为字符串向量。