Почему фрейм данных из словаря ведет себя в R иначе, чем отдельный фрейм данных через ретикулат?

Я использую reticulate из R и пытаюсь преобразовать кадр данных pandas из словаря в кадр данных R, но я обнаружил, что преобразование не работает, и я не уверен, почему? Я хочу иметь доступ к столбцам данных, используя синтаксис R (т.е. $). Когда я создаю автономный фрейм данных в Python и возвращаю его в R, у меня нет проблем.

в Питоне


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, имя, молчание): AttributeError: объект «DataFrame» не имеет атрибута «1»

Может ли кто-нибудь объяснить, почему это и способ манипулирования объектами из словарей в R? заранее спасибо


person CRWrangler    schedule 21.08.2019    source источник


Ответы (1)


Как я смотрю данные, R_df имеет класс, показанный ниже

> 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"   

Этот класс не поддерживает в R dataframe.

Я предложу два метода.

Способ 1. хитрый способ

Вы должны использовать хитрый метод, используя 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
person Steve Lee    schedule 22.08.2019