У меня возникла проблема с изменением целочисленной серии в 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
работы.
Любые предложения?
Спасибо!
Хорошо, спасибо. Прямо сейчас я использую обходной путь, так что это не замедляет меня. – kmt
просто исправил это в главном – Jeff