使用 rpy2 将文本列中带有 NA 的 R 数据帧转换为 Python

问题描述 投票:0回答:1

我想使用 rpy2 将 R 数据帧转换为 python。 我不知道如何将文本列中出现的 NA 转换为 Python 值。

这是一个显示我的问题的示例。

import rpy2.robjects as ro
ro.r('n = c(1,2)')
ro.r("b = c(NA,'def')")
ro.r("df = data.frame(n,b)")
rdf = ro.r('df')
from rpy2.robjects.conversion import localconverter
from rpy2.robjects import pandas2ri
with localconverter(ro.default_converter + pandas2ri.converter):
    df = ro.conversion.rpy2py(rdf)

产品:

>>> print(df)
     n              b
1  1.0  NA_character_
2  2.0            def

旧版本 rpy2 的类似代码曾经可以工作

import rpy2.robjects as ro
ro.r('n = c(1,2)')
ro.r("b = c(NA,'def')")
ro.r("df = data.frame(n,b)")
rdf = ro.r('df')
from rpy2.robjects import pandas2ri
df = pandas2ri.ri2py(rdf)

制作:

>>> print(df)
     n    b
0  1.0  NaN
1  2.0  def

如何恢复原来的行为?

python r rpy2
1个回答
0
投票

这似乎是 rpy2 版本 3.5.14 的一个错误,它也出现在 numpy 转换器中。在修复之前,您可以使用已弃用的

pandas2ri.activate()

import rpy2.robjects as ro
ro.r('n = c(1,2)')
ro.r("b = c(NA,'def')")
ro.r("df = data.frame(n,b)")
rdf = ro.r('df')
from rpy2.robjects import pandas2ri
pandas2ri.activate()
df = ro.conversion.rpy2py(rdf)
print(df)

输出:

     n     b
1  1.0  None
2  2.0   def

请注意,第一个值不是

NaN
,而是
None
,但这是有道理的,因为
b
列的值是字符串而不是数字。如果
b
是一列数字,例如
ro.r("b = c(NA, 3)")
,那么你会得到
NaN

© www.soinside.com 2019 - 2024. All rights reserved.