Python Rpy2问题,将df转换回熊猫

Python Rpy2问题,将df转换回熊猫,python,pandas,rpy2,Python,Pandas,Rpy2,我已经处理了一个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

我已经处理了一个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
当我将其转换为pandas时,它用整数替换
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\u df
的列中设置不同的数据类型,但没有成功。如何解决此问题


注意,在转换为pandas之前,将
r\u-df[is.na(r\u-df)]='None'
设置可以解决此问题。但它应该比这更简单

可能的问题是,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中,这是一个整数值的R数组,仅使用0、1和-2147483648中的一个(分别用于
FALSE
TRUE
NA
)。rpy2转换器正在转换为整数的
numpy
向量,因为:

  • rpy2
    实现允许跨两种语言匹配C数组
  • numpy
    使用该接口()
诚然,这只是实现转换的方法之一,在某些情况下,这不是最方便的方法。使用自定义转换器可以获得更适合您的行为

PS:下面是关于您的解决方法的另一个注意事项

注意,将r_-df[is.na(r_-df)]设置为“无”,然后再转换为熊猫 解决了这个问题。但它应该比这更简单


这里发生的是,您正在将R布尔向量转换为字符串向量。

非常感谢,这很有趣。您将如何使用自定义转换器?你能提供更多关于你的意思的细节吗?非常感谢。文档是一个不错的起点:。然后是熊猫的rpy2转换代码。