我想使用 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
如何恢复原来的行为?
这似乎是 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
。