将 df 转换回 pandas 的 Rpy2 问题

Rpy2 issue with converting df back to pandas

我有一个已处理的 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_df的列中设置不同的数据类型,但没有用。我该如何解决这个问题?

请注意,在转换为 pandas 之前设置 r_df[is.na(r_df)]='None' 可解决此问题。不过应该比这个简单

可能的问题是 R 有一个 "NA" 布尔值("logical vectors" 在 R 术语中)和整数值,而 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" 是类型 "logical" (LGLSXP) 但在 C 中这是一个整数值的 R 数组使用只有 0、1 和 -2147483648 之一(分别对应 FALSETRUENA)。 rpy2 转换器正在转换为 numpy 整数向量,因为:

诚然,这只是实现转换的方法之一,在某些情况下这并不是最方便的。使用自定义转换器可获得更适合您的行为。

PS: 下面是关于您的解决方法的另外一条注释

Note, setting r_df[is.na(r_df)]='None' prior to converting to pandas solves the issue. But it should be simpler than this

此处发生的事情是您将 R 布尔向量转换为字符串向量。