Rpy2 проблема с преобразованием df обратно в панд - PullRequest
1 голос
/ 03 мая 2019

У меня есть обработанный кадр данных R:

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

from rpy2.robjects.conversion import localconverter
pandas2ri.activate()
import pandas as pd

%%R
n = c(2, 3, 5) 
s = c("aa", "bb", "cc")
b = c(TRUE, FALSE, TRUE) 
r_df = data.frame(n, s, b)
r_df[['c']]=NA

r_df

#out:
#  n  s b  c
#1 2 aa 1 NA
#2 3 bb 0 NA
#3 5 cc 1 NA

Когда я преобразую его в панд, он заменяет NA на целые числа.

with localconverter(ro.default_converter + pandas2ri.converter):
    pd_from_r_df = ro.conversion.rpy2py(ro.r('r_df'))

pd_from_r_df
#Out:
#   n        s  b   c
#1  2.0     aa  1   -2147483648
#2  3.0     bb  0   -2147483648
#3  5.0     cc  1   -2147483648

Я пыталсяустанавливать разные типы данных в столбцах r_df, но безрезультатно.Как я могу решить эту проблему?

Обратите внимание, что установка r_df[is.na(r_df)]='None' перед преобразованием в pandas решает проблему.Но это должно быть проще, чем это

1 Ответ

2 голосов
/ 05 мая 2019

Вероятная проблема заключается в том, что R имеет значение "NA" для логических значений ("логические векторы" в R lingo) и целочисленных значений, а Python / numpy - нет.

Посмотрите, как dtypeмежду двумя следующими примерами изменилось:

In [1]: import pandas                     

In [2]: pandas.Series([True, False, True])
Out[2]: 
0     True
1    False
2     True
dtype: bool

In [3]: pandas.Series([True, False, None])
Out[3]: 
0     True
1    False
2     None
dtype: object

Здесь происходит то, что столбец "c" в вашем фрейме данных R имеет тип "логический" (LGLSXP), но в C это Rмассив целочисленных значений с использованием только одного из 0, 1 и -2147483648 (для FALSE, TRUE и NA соответственно).Конвертер rpy2 преобразует в вектор целых чисел numpy, потому что:

По общему признанию, это только один из способов приблизиться к конверсии, и естьситуации, когда это не самое удобное.С помощью пользовательского конвертера вы можете получить поведение, которое вас устраивает.

PS: Еще одно замечание о вашем обходном пути ниже

Примечание, настройкаr_df [is.na (r_df)] = 'Нет' перед преобразованием в панд решает проблему.Но это должно быть проще, чем это

Здесь происходит то, что вы преобразовываете логический вектор R в вектор строк.

...