2017-02-14 20 views
2

У меня возникла проблема при использовании пакета rpy2 для преобразования dataframe, сохраненного в R в Python.Проблема с обработкой rpy2 NA/отсутствующее значение в dataframe от R до Python

import os 
os.environ['R_HOME'] = '/Library/Frameworks/R.framework/Resources' 

import rpy2.robjects as ro 
from rpy2.robjects import pandas2ri 

# define a trivial dataframe in R 
ro.r('n = c(1,2)') 
ro.r("b = c(NA,'def')") 
ro.r("temp_df = data.frame(n,b)") 

# the dataframe in R shows missing value in one cell as NA 
temp_rdf = ro.r('temp_df') 
print(temp_rdf) 

    n b 
1 1 <NA> 
2 2 def 

# yet the transformed Python dataframe replace the missing value with a string 
temp_pydf = pandas2ri.ri2py(temp_rdf) 
print(temp_pydf) 

    n b 
1 1.0 def 
2 2.0 def 

Я сделал некоторые поиски и нашел этот пост Rpy2 pandas2ri.ri2py() is converting NA values to integers. Это объясняет, почему, но не дает решения для этого. Я хочу иметь значения Null в Python для этих NA в R dataframe. Как я могу это сделать?

ответ

1

Обновление: http://rpy.sourceforge.net/rpy2/doc-2.2/html/rinterface.html

Выше ссылка может иметь полезную информацию о некоторых параметрах. Если вы обнаружите «NA» (укажите пробел) и перейдите ко второму нажатию. Существует один, который выглядит так, как будто он связан с вашей проблемой NA.

Оригинальный пост: Предполагая, что «def», как показано на вашем выходе, идет в качестве строки вы можете заменить его на строку, в которой вы уверены, не является значением в ваших данных, а затем используйте это вместо значения NA, которое не приходит:

Этот пример кода иллюстрирует концепцию.

x = "def" 
type(x) 
x = x.replace("def", "NA") 
x 

Глядя на проблему, что ваш источник имеет две строки, как говорят, «DEF» тот, где он пришел из данных а го другого, где NA преобразуется в Защиту:

  1. Преобразовать «четкости» на что-то еще в R
  2. принести в данных
  3. Теперь «DEF» означает NA
  4. использовать его в качестве такового или преобразовать его в то вы можете жить с

Сложность, с которой вы часто сталкиваетесь?

  1. если да, то создать тестовую функцию, чтобы проверить ваши данные для «Защиты»

  2. если найдено заменить что-то сумасшедшее вы знаете, что данные не будут иметь, как: my_crazy_replacementValue

  3. заменить " Защита»с нужным дублером для NA

  4. заменить my_crazy_replacementValue с "DEF"

В Python, наиболее распространенное значение для NA, я думаю, что None. Unfortuantely, вы не можете заменить значение с помощью Нет:

string.replace() 

Представляется целесообразным, что должен быть лучший ответ: «Pythonic» способ преобразования заданного значения в кадре данных Нет. Я должен рассмотреть Pandas -> кадры данных, когда я получаю шанс, а затем я могу вернуться и отредактировать этот абзац (или, может быть, кто-то меня побьет). Надеясь, что вышеизложенное может помочь вам в этом.

+0

Спасибо за ответ. Есть много файлов RData, которые содержат dataframe, и я хочу загрузить и обработать их в Python. Пример только для того, чтобы показать проблему.Я ищу решение только в среде Python и не использую R для предварительной обработки данных. –

+0

Я новичок в этом тоже. Так простите меня, если это не то, что вы ищете. Как только библиотека развращает ваши данные, если «def» представляется для двух разных строк (изначально «def» и изначально «NA»), вы теряете точность. Невозможно исправить это на Python после факта. Единственный ответ, который меня поражает, но я не могу вам помочь в его создании: используйте операции с файлами Python для обработки файлов, исправляющих значение temp. Затем используйте операции Data frame для очистки результата после Python. Я должен отдать другим людям больше опыта, чем это возможно. – TMWP

+0

Спасибо за активное участие в этом обсуждении TMWP. Я действительно удивлен тем, как pandas2ri.ri2py обрабатывает NA в R dataframe. Естественный способ наполняет их как Null вместо некоторой ценности в своем Факторе. Мне жаль, что есть простой способ передвижения, задав некоторые магические параметры в rpy2 или написав низкоуровневую функцию rpy2. –