使用rpy2将含浮点数的Pandas列转为R ts对象时获array类型的解决方法
Pandas浮点数列转R ts对象时返回array的解决方法
在使用rpy2将Pandas数据框中的列转换为R的ts对象时,若列包含浮点数,得到的R对象类型会变成array而非预期的ts类型。复现代码及现象如下:
整数列转换正常
import pandas as pd path_to_Rdll = "_path_goes_here" import os os.environ['R_HOME'] = path_to_Rdll import rpy2 import rpy2.robjects as robjects from rpy2.robjects import pandas2ri pandas2ri.activate() print(rpy2.__version__) r_ts_function = robjects.r('ts') # 整数列转换正常 pandas_dataFrame = pd.DataFrame({'value': [3, 2, 1]}) rdata_1 = r_ts_function(pandas_dataFrame.value.values) print("class(rdata_1):") print(robjects.r('class')(rdata_1))
输出符合预期:
class(rdata_1): ['ts']
浮点数列转换异常
pandas_dataFrame = pd.DataFrame({'value': [3.1, 2, 1]}) rdata_2 = r_ts_function(pandas_dataFrame.value.values) print("class(rdata_2):") print(robjects.r('class')(rdata_2))
输出为:
class(rdata_2): ['array']
问题原因
问题根源在于pandas_dataFrame.value.values返回的numpy浮点数组(float64类型)会被rpy2默认转换为R的array对象,而R的ts()函数在接收array作为输入时,不会自动将其包装为ts类型;而整数类型的numpy数组会被转换为R的vector,ts()函数可以直接将其转为ts对象。
解决方法
方法1:将numpy浮点数组转换为rpy2的
FloatVector
手动将numpy数组转为rpy2的浮点向量,确保输入ts()函数的是R的vector类型:pandas_dataFrame = pd.DataFrame({'value': [3.1, 2, 1]}) r_vector = robjects.FloatVector(pandas_dataFrame.value.values) rdata_2 = r_ts_function(r_vector) print("class(rdata_2):") print(robjects.r('class')(rdata_2))输出:
class(rdata_2): ['ts']方法2:直接传入Pandas Series
激活pandas2ri后,rpy2可以直接将Pandas Series转换为R的vector类型,无需手动处理numpy数组:pandas_dataFrame = pd.DataFrame({'value': [3.1, 2, 1]}) rdata_2 = r_ts_function(pandas_dataFrame.value) print("class(rdata_2):") print(robjects.r('class')(rdata_2))方法3:在R函数中显式转换输入类型
定义一个R函数,先将输入的array转为vector,再创建ts对象:pandas_dataFrame = pd.DataFrame({'value': [3.1, 2, 1]}) r_ts_function = robjects.r('function(x) ts(as.vector(x))') rdata_2 = r_ts_function(pandas_dataFrame.value.values) print("class(rdata_2):") print(robjects.r('class')(rdata_2))
内容的提问来源于stack exchange,提问作者sbs0202
相关产品推荐
相关产品推荐

