Подтвердить что ты не робот

Замена Pandas или Numpy Nan с помощью None для использования с MysqlDB

Я пытаюсь написать фреймворк Pandas (или использовать массив numpy) в базу данных mysql, используя MysqlDB. MysqlDB, похоже, не понимает "nan", и моя база данных выдает ошибку, говорящую, что nan не входит в список полей. Мне нужно найти способ превратить "нан" в NoneType.

Любые идеи?

4b9b3361

Ответ 1

У @bogatron все правильно, вы можете использовать where, стоит отметить, что вы можете делать это изначально в пандах:

df1 = df.where((pd.notnull(df)), None)

Примечание. Это изменяет dtype всех столбцов на object.

Пример:

In [1]: df = pd.DataFrame([1, np.nan])

In [2]: df
Out[2]: 
    0
0   1
1 NaN

In [3]: df1 = df.where((pd.notnull(df)), None)

In [4]: df1
Out[4]: 
      0
0     1
1  None

Примечание: то, что вы не можете сделать, переделать DataFrames dtype, чтобы разрешить все типы данных, используя astype, а затем метод DataFrame fillna :

df1 = df.astype(object).replace(np.nan, 'None')

К сожалению, ни это, ни использование replace не работают с None, смотрите эту (закрытую) проблему.


Кроме того, стоит отметить, что для большинства случаев использования вам не нужно заменять NaN на None, см. этот вопрос о разнице между NaN и None в пандах.

Тем не менее, в этом конкретном случае, кажется, вы делаете (по крайней мере, на момент этого ответа).

Ответ 2

df = df.replace({pd.np.nan: None})

Это заслуга этого парня здесь, в вопросе Github.

Ответ 3

Вы можете заменить nan на None в вашем массиве numpy:

>>> x = np.array([1, np.nan, 3])
>>> y = np.where(np.isnan(x), None, x)
>>> print y
[1.0 None 3.0]
>>> print type(y[1])
<type 'NoneType'>

Ответ 4

После спотыкания это сработало для меня:

df = df.astype(object).where(pd.notnull(df),None)

Ответ 5

Довольно старый, но я наткнулся на ту же проблему. Попробуйте сделать это:

df['col_replaced'] = df['col_with_npnans'].apply(lambda x: None if np.isnan(x) else x)

Ответ 6

Просто дополнение к ответу Энди Хейдена:

Поскольку DataFrame.mask является противоположным двойником DataFrame.where, они имеют точно такую же подпись, но с противоположным значением:

  • DataFrame.where полезен для DataFrame.where значений, где условие имеет значение False.
  • DataFrame.mask используется для DataFrame.mask значений, когда условие имеет значение True.

Поэтому в этом вопросе использование df.mask(df.isna(), other=None, inplace=True) может быть более интуитивно понятным.

Ответ 7

Еще одно дополнение: будьте осторожны при замене кратных и преобразовании типа столбца обратно из объекта в float. Если вы хотите быть уверены, что ваш None не вернется к np.NaN, примените предложение @andy-hayden с помощью pd.where. Иллюстрация того, как замена все еще может пойти не так:

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: df = pd.DataFrame({"a": [1, np.NAN, np.inf]})

In [4]: df
Out[4]:
     a
0  1.0
1  NaN
2  inf

In [5]: df.replace({np.NAN: None})
Out[5]:
      a
0     1
1  None
2   inf

In [6]: df.replace({np.NAN: None, np.inf: None})
Out[6]:
     a
0  1.0
1  NaN
2  NaN

In [7]: df.where((pd.notnull(df)), None).replace({np.inf: None})
Out[7]:
     a
0  1.0
1  NaN
2  NaN