2014-06-25 15 views
3

我有一个熊猫数据帧,我想通过rpy2转换为R数据帧使用。熊猫数据帧的数据类型是布尔值,具体为numpy.bool_。尝试使用convert_to_r_dataframe时,我收到KeyError。我正在使用熊猫0.13.1。熊猫convert_to_r_dataframe不适用于numpy.bool_

我正在做一些我不应该做的事情?我不应该使用块状布尔值?

下面是一个例子,

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