将 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 之一(分别对应 FALSE
、TRUE
和 NA
)。 rpy2 转换器正在转换为 numpy
整数向量,因为:
rpy2
实现 numpy array interface 以允许在两种语言之间匹配 C 数组。
numpy
使用该接口 (numpy.array()
is called by rpy2
)
诚然,这只是实现转换的方法之一,在某些情况下这并不是最方便的。使用自定义转换器可获得更适合您的行为。
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 布尔向量转换为字符串向量。
我有一个已处理的 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 之一(分别对应 FALSE
、TRUE
和 NA
)。 rpy2 转换器正在转换为 numpy
整数向量,因为:
rpy2
实现 numpy array interface 以允许在两种语言之间匹配 C 数组。numpy
使用该接口 (numpy.array()
is called byrpy2
)
诚然,这只是实现转换的方法之一,在某些情况下这并不是最方便的。使用自定义转换器可获得更适合您的行为。
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 布尔向量转换为字符串向量。