2013-02-25 3 views
1

У меня возникла проблема с изменением целочисленной серии в DataFrame. Проблема возникает, когда я пытаюсь изменить часть целочисленного ряда на равную часть другого целочисленного ряда.TypeError при смене целочисленной серии данных в pandas

Вот простой код, который воспроизводит мою проблему:

import pandas as pd 
import numpy as np 
a = np.arange(10,dtype=np.int) 
b = a**2 - 10*a + 12 
df = pd.DataFrame({'a':a,'b':b,'a_float':a.astype(np.float), 
        'b_float':b.astype(np.float)}) 
print df.dtypes 

a   int64 
a_float float64 
b   int64 
b_float float64 

cond = df.b<0 
df.b[cond] = 7 #works, as expected 
df.b_float[cond] = df.a_float[cond] #works 
df.b[cond] = df.a[cond] #gives a TypeError 

-------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-25-518b5957d002> in <module>() 
----> 1 df.b[cond] = df.a[cond] 

Users/kmt/Envs/scilab/lib/python2.7/site-packages/pandas-0.11.0.dev_eb3134f-py2.7-macosx-  10.7-x86_64.egg/pandas/core/series.pyc in __setitem__(self, key, value) 
    740   if _is_bool_indexer(key): 
    741    key = _check_bool_indexer(self.index, key) 
--> 742    self.where(~key,value,inplace=True) 
    743   else: 
    744    self._set_with(key, value) 

/Users/kmt/Envs/scilab/lib/python2.7/site-packages/pandas-0.11.0.dev_eb3134f-py2.7-macosx- 10.7-x86_64.egg/pandas/core/series.pyc in where(self, cond, other, inplace) 
    681    raise ValueError('Length of replacements must equal series length') 
    682 
--> 683   np.putmask(ser, ~cond, other) 
    684 
    685   return None if inplace else ser 

TypeError: Cannot cast array data from dtype('float64') to dtype('int64') according to the rule 'safe' 

Обратите внимание, что

b[cond] = a[cond] 
df.b = b 

работы.

Любые предложения?

Спасибо!

ответ

1

вы попали в эту ошибку, которую мы недавно обнаружили. см. здесь: https://github.com/pydata/pandas/issues/2746. К сожалению, это немного сложно. Вы хотите установить inplace с помощью boolean int (который не требует заполнения). Я свяжусь с этим примером и посмотрю.

+0

Хорошо, спасибо. Прямо сейчас я использую обходной путь, так что это не замедляет меня. – kmt

+0

просто исправил это в главном – Jeff