ValueError при назначении значений nan с использованием DataFrame.at в целочисленном фрейме данных в пандах - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть следующее DataFrame, которое состоит из целочисленных значений:

df = pd.DataFrame(data=1, columns=['a','b'], index=[1,2,3])

   a  b
1  1  1
2  1  1
3  1  1

Я хотел бы установить пропущенные значения для отдельных ячеек, и при попытке:

df.at[1,'a'] = np.nan

Тогда я получаю это исключение:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "pandas/core/indexing.py", line 2159, in __setitem__
    self.obj._set_value(*key, takeable=self._takeable)
  File "pandas/core/frame.py", line 2582, in _set_value
    engine.set_value(series._values, index, value)
  File "pandas/_libs/index.pyx", line 124, in pandas._libs.index.IndexEngine.set_value
  File "pandas/_libs/index.pyx", line 133, in pandas._libs.index.IndexEngine.set_value
  File "pandas/_libs/index.pyx", line 570, in pandas._libs.index.convert_scalar
ValueError: Cannot assign nan to integer series

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Добавление astype

df.a=df.a.astype(float)
df.at[1,'a']=np.nan
df
Out[43]: 
     a  b
1  NaN  1
2  1.0  1
3  1.0  1
0 голосов
/ 02 ноября 2018

Кажется, что функция DataFrame.at не может приводить целые числа к числу с плавающей запятой, если установлено NaN с.

У меня работает DataFrame.loc:

df.loc[1,'a'] = np.nan
print (df)
     a  b
1  NaN  1
2  1.0  1
3  1.0  1

@ Объяснение Питера Леймбиглера:

Причина, по которой в первую очередь требуется любое приведение типов, заключается в том, что nan имеет тип float , а тип данных int не поддерживает для nan или любого другого пропущенного значения. Чтобы числовой столбец содержал nan , он должен иметь тип float .

@ pir Объяснение:

pandas.DataFrame.at оптимизирован для доступа к определенной ячейке. Поэтому он не может изменить тип столбца. Однако loc может.

...