为什么来自字典的数据帧在 R 中的行为与通过网状结构的独立数据帧不同?

Why is a dataframe from a dictionary behaving differently in R from a standalone dataframe via reticulate?

我在 R 中使用 reticulate 并尝试将 pandas 数据帧从字典转换为 R 数据帧,但我发现转换不起作用,我不确定为什么?我希望能够使用 R 语法(即 $)访问数据框列。当我在 Python 中生成独立数据帧并将其 return 生成到 R 时,我没有问题。

在Python


def createDataFrame(x):

        a=(x,x)
        b=pd.DataFrame(np.ones(a)*x)
        return b

def createDictionary(x):
    dict1={}

    a=(x,x)
    b=pd.DataFrame(np.ones(a)*x)

    dict1['test'] = pd.DataFrame(b)


    return dict1

df  = createDataFrame(3)
Dict = createDictionary(3)

在 R 中使用网状包

source("py_script.py")
df$'1' 

R_Df <- Dict$test
R_Df$'1'

我希望 df$'1' 和 R_df$'1' 生成相同的输出,即来自相关数据框的列向量。但是我没有从第二次通话中得到任何回复 - 相反我得到以下信息:

产生错误

py_get_attr_impl(x, name, silent) 错误: AttributeError: 'DataFrame' 对象没有属性 '1'

谁能解释为什么会这样,以及在 R 中从字典中操作对象的一种方法?提前致谢

当我查看数据时,R_df 有 class 如下所示

> class(R_Df)
[1] "pandas.core.frame.DataFrame"       
[2] "pandas.core.generic.NDFrame"       
[3] "pandas.core.base.PandasObject"     
[4] "pandas.core.base.StringMixin"      
[5] "pandas.core.accessor.DirNamesMixin"
[6] "pandas.core.base.SelectionMixin"   
[7] "python.builtin.object"   

这个 class 在 R dataframe 中不支持。

我会建议两种方法。

方法一、取巧的方法

你应该使用棘手的方法 rjson

reticulate::source_python('code.py')
library(rjson)
R_Df <- data.frame(Dict$test)
library(data.table)  # I used data.table library cause of column name.
R_Df = rbindlist(lapply(fromJSON(R_Df$to_json(orient='records')), as.data.table))
> R_Df$'1'
[1] 3 3 3

方法2.使用新版本

开发人员合并了对 Pandas 数据帧与主数据帧之间相互转换的支持。 您可以使用它手动下载 github

devtools::install_github("rstudio/reticulate")
library(reticulate)
reticulate::source_python('code.py')
R_df<-Dict$test
> R_Df$'1'
[1] 3 3 3