2014-06-25 2 views
3

У меня есть кадр данных pandas, который я бы хотел преобразовать в фрейм данных R для использования через rpy2. Типы данных кадра данных pandas являются булевыми, в частности numpy.bool_. При попытке использовать convert_to_r_dataframe я получаю KeyError. Я использую панды 0.13.1.pandas convert_to_r_dataframe не работает с numpy.bool_

Я делаю то, что я не должен делать? Должен ли я не использовать numpy booleans?

Вот пример,

import pandas 
import pandas.rpy.common as common 
import numpy as np 

# This works fine. 
test_df_float = pandas.DataFrame(np.random.rand(10, 3), columns=list('xyz')) 
r_test_df_float = common.convert_to_r_dataframe(test_df_float) 

# This is a problem. 
test_df_bool = pandas.DataFrame(np.random.rand(10, 3) > 0.5, columns=list('xyz')) 
r_test_df_bool = common.convert_to_r_dataframe(test_df_bool) 

KeyError         Traceback (most recent call last) 
<ipython-input-11-323084399e95> in <module>() 
----> 1 r_test_df_bool = common.convert_to_r_dataframe(test_df_bool) 

/usr/lib/python2.7/site-packages/pandas/rpy/common.pyc in convert_to_r_dataframe(df, strings_as_factors) 
311      for item in value] 
312 
--> 313    value = VECTOR_TYPES[value_type](value) 
314 
315    if not strings_as_factors: 

KeyError: <type 'numpy.bool_'> 

ответ

1

Я думаю, что это может быть ошибка, что раньше np.bool теперь называется np.bool_ и ключ отсутствует для двух словаря в исходном файле, так модифицировать источник (строка 261 в .../сайт-пакеты/панды/RPY/common.py) к следующему будет делать трюк:

VECTOR_TYPES = {np.float64: robj.FloatVector, 
       np.float32: robj.FloatVector, 
       np.float: robj.FloatVector, 
       np.int: robj.IntVector, 
       np.int32: robj.IntVector, 
       np.int64: robj.IntVector, 
       np.object_: robj.StrVector, 
       np.str: robj.StrVector, 
       np.bool: robj.BoolVector, 
       np.bool_: robj.BoolVector} #new key 

NA_TYPES = {np.float64: robj.NA_Real, 
      np.float32: robj.NA_Real, 
      np.float: robj.NA_Real, 
      np.int: robj.NA_Integer, 
      np.int32: robj.NA_Integer, 
      np.int64: robj.NA_Integer, 
      np.object_: robj.NA_Character, 
      np.str: robj.NA_Character, 
      np.bool: robj.NA_Logical, 
      np.bool_: robj.NA_Logical} #new key 

в основном вам просто нужно добавить последний ключ в обоих dictionarys ,

+0

Отлично. Большое спасибо. Это исправило это. – mjandrews

Смежные вопросы