如何使用 rpy2 将数据框列转换为因子?

Nor*_*ine 5 python r type-conversion dataframe rpy2

我有一个DataFramePython 中的 Pandas,我正在data.frame使用rpy2. 一些示例设置代码如下:

import pandas as pd
import rpy2.robjects as robjects
from rpy2.robjects import r, pandas2ri

df = pd.DataFrame({
    'col_1': ['a', 'b', 'c'], 
    'col_2': [1, 2, 3],
    'col_3': [2.3, 5.4, 3.8]
})

pandas2ri.activate()
r_df = pandas2ri.py2ri(df)
Run Code Online (Sandbox Code Playgroud)

col_2充满了整数值,并且正如预期的那样,在转换过程中,它被转换为 R 的int原子模式。我可以使用以下命令检查类(我理解这些类指示哪些函数可以应用于底层对象):

r.sapply(r_df, r['class'])
Run Code Online (Sandbox Code Playgroud)

然而,这个变量实际上是名义变量(无序分类)。因此,我需要将此列转换为一个因子。

在 RI 中,可以使用以下方法通过重新分配轻松地做到这一点:

r_df$col2 <- as.factor(r_df$col2)
Run Code Online (Sandbox Code Playgroud)

但是,我不确定使用的语法是否正确rpy2。我可以使用访问器方法访问该列rx2,并使用 将该列转换为一个因子FactorVector

 col2 = robjects.vectors.FactorVector(r_df.rx2('col_2'))
Run Code Online (Sandbox Code Playgroud)

但是,我似乎无法将其重新分配回原始数据框。将其重新分配回原始数据框的最佳方法是什么?有没有更好的方法来进行这种转换?谢谢

附加

我已经设法使用下面的代码转换col_2为 a factor,但感觉不是最佳答案,因为我必须查找所有列名称,使用 Python 方法而不是 R 查找所需列的索引,然后用它来重新分配。

col_2_index = list(r_df.colnames).index('col_2')
col_2 = robjects.vectors.FactorVector(r_df.rx2('col_2'))
r_df[assessor_col_index] = col_2
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望看到一种不依赖于查找列索引的重新分配方法。但是,我之前的尝试引发了以下错误:

r_df['col_2'] = converted_col
TypeError: SexpVector indices must be integers, not str
Run Code Online (Sandbox Code Playgroud)

或者

r_df.rx2('col_2') = converted_col
SyntaxError: can't assign to function call
Run Code Online (Sandbox Code Playgroud)