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


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

какие идеи?

4   51   2013-01-04 22:26:06

4 ответа:

@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

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

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

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


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

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

вы можете заменить 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'>

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

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

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

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