如何用rpy2将含NA文本列的R数据框转为Python并恢复旧行为?
解决rpy2新版本中R文本列NA转换为NA_character_的问题
在rpy2新版本中,使用localconverter结合pandas2ri.converter转换R数据框时,字符列的NA会被转为字符串NA_character_,而旧版本会直接映射为Python的NaN。要恢复旧版本的转换行为,你需要自定义字符型向量的转换规则,覆盖默认的转换逻辑。
解决方案代码
import rpy2.robjects as ro from rpy2.robjects.conversion import localconverter, Converter from rpy2.robjects import pandas2ri import pandas as pd import numpy as np # 自定义字符向量转换函数:将R的NA_character_转为NaN def r_charvec_to_py(vec): py_list = list(vec) # 替换NA_character_为NaN return [np.nan if x == 'NA_character_' else x for x in py_list] # 创建自定义转换器,并注册字符向量的转换规则 custom_converter = Converter() custom_converter.rpy2py.register(ro.vectors.StrVector, r_charvec_to_py) # 构造R数据框 ro.r('n = c(1,2)') ro.r("b = c(NA,'def')") ro.r("df = data.frame(n,b)") rdf = ro.r('df') # 使用自定义转换器+ pandas2ri转换器进行转换 with localconverter(ro.default_converter + pandas2ri.converter + custom_converter): df = ro.conversion.rpy2py(rdf) print(df)
运行结果
n b 0 1.0 NaN 1 2.0 def
补充说明
如果你的pandas版本支持pd.NA(更适合字符串列的缺失值表示),可以把转换函数里的np.nan换成pd.NA,结果会显示为<NA>,这也是更符合pandas字符串类型的缺失值处理方式。
内容的提问来源于stack exchange,提问作者Federico Cozzi
相关产品推荐
相关产品推荐

