Как экспортировать список фреймов данных из R в Python? - PullRequest
1 голос
/ 17 апреля 2019

В настоящее время я работаю с функциональными данными МРТ в R, но мне нужно импортировать их в Python для более быстрого анализа. Как я могу сделать это эффективным способом?

В настоящее время у меня в R список 198135 кадров данных. Все они имеют 5 переменных и 84 наблюдения за связностью между областями мозга. Мне нужно отобразить те же кадры данных 198135 в Python для выполнения там определенного анализа (с той же структурой, что и в R: один объект, который содержит все кадры данных отдельно).

Изначально я пытался экспортировать файл .RDS из R, а затем импортировать его в Python, используя "pyreadr", но я получаю пустые объекты в каждой попытке с помощью функции "pyreadr.read_r ()".

Мой другой метод состоял в том, чтобы сохранить каждый фрейм данных списка R в виде отдельного файла .csv, а затем импортировать их в Python. Таким образом, я мог получить то, что хотел (я пробовал это с 100 кадрами данных только для того, чтобы попробовать код). Проблема этого метода в том, что он крайне неэффективен и медленен.

Я нашел несколько ответов на похожие проблемы, но большинство из них состояло в том, чтобы объединить все кадры данных и загрузить их как уникальный .csv в Python, а это не то решение, которое мне нужно.

Есть ли какой-нибудь более эффективный способ сделать этот процесс, не изменяя структуру данных, о которой я говорил?

Спасибо за вашу помощь!

# This is the code in R for an example

a <- as.data.frame(cbind(c(1:3), c(1:3), c(4:6), c(7:9)))
b <- as.data.frame(cbind(c(11:13), c(21:23), c(64:66), c(77:79)))
c <- as.data.frame(cbind(c(31:33), c(61:63), c(34:36), c(57:59)))
d <- as.data.frame(cbind(c(12:14), c(13:15), c(54:56), c(67:69)))
e <- as.data.frame(cbind(c(31:33), c(51:53), c(54:56), c(37:39)))

somelist_of_df <- list(a,b,c,d,e)


saveRDS(somelist_of_df, "somefile.rds") 
## This is the function I used from pyreadr in Python


import pyreadr

results = pyreadr.read_r('/somepath/somefile.rds')


Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Хорошо, спасибо за помощь в других ответах, но это не совсем то, что я искал (я хотел экспортировать только один файл со списком фреймов данных внутри него, а затем загрузить один единственный файл в Python, сохраняята же структура).Для использования пера вы должны разложить список во всех фреймах данных внутри него, почти как сохранение отдельных CSV-файлов, а затем загрузить каждый из них в Python (или R).В любом случае, нужно сказать, что это намного быстрее, чем метод с .csv.

Я оставляю код, который я успешно использовал , в отдельном ответе, возможно, он может быть полезен для других людей.поскольку я использовал простой цикл для загрузки фреймов данных в Python в виде списка:

## Exporting a list of dataframes from R to .feather files

library(feather) #required package

a <- as.data.frame(cbind(c(1:3), c(1:3), c(4:6), c(7:9))) #Example DFs
b <- as.data.frame(cbind(c(11:13), c(21:23), c(64:66), c(77:79)))
c <- as.data.frame(cbind(c(31:33), c(61:63), c(34:36), c(57:59)))
d <- as.data.frame(cbind(c(12:14), c(13:15), c(54:56), c(67:69)))
e <- as.data.frame(cbind(c(31:33), c(51:53), c(54:56), c(37:39)))

somelist_of_df <- list(a,b,c,d,e) 

## With sapply you loop over the list for creating the .feather files

sapply(seq_along(1:length(somelist_of_df)), 
       function(i) write_feather(somelist_of_df[[i]], 
                                 paste0("/your/directory/","DF",i,".feather")))

(при использовании только MacBook Air приведенный выше код запустился менее чем за 5 секунд, чтобы запустить список DF-файлов 198135 года)

## Importing .feather files into a list of DFs in Python

import os
import feather

os.chdir('/your/directory')

directory = '/your/directory'

py_list_of_DFs = []

for filename in os.listdir(directory):
    DF = feather.read_dataframe(filename)
    py_list_of_DFs.append(DF)

(Этот код помог мне, кроме того, он был немного медленным, для выполнения задачи для DFs 198135 потребовалось 12 минут)

Надеюсь, это кому-нибудь пригодится.

0 голосов
/ 17 апреля 2019

Этот пакет может вас заинтересовать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...