为什么来自字典的数据帧在 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
我在 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