Я пытаюсь записать фреймворк Pandas (или можно использовать массив numpy) в базу данных mysql с помощью MysqlDB. MysqlDB, похоже, не понимает "nan", и моя база данных выдает ошибку, говоря, что nan отсутствует в списке полей. Мне нужно найти способ преобразовать «nan» в NoneType.
Любые идеи?
None
наNULL
вместоnan
?Ответы:
@bogatron прав, вы можете использовать
where
, стоит отметить, что вы можете сделать это изначально в пандах:Примечание: это изменяет dtype всех столбцов на
object
.Пример:
Примечание: то, что вы не можете сделать, переделать DataFrames,
dtype
чтобы разрешить все типы данных, используяastype
, а затемfillna
метод DataFrame :К сожалению , ни этого, ни с помощью
replace
, работа сNone
увидеть это (закрытый) вопрос .В стороне, стоит отметить, что для большинства случаев использования вам не нужно заменять NaN на None, см. Этот вопрос о разнице между NaN и None в пандах .
Однако в этом конкретном случае кажется, что да (по крайней мере, на момент этого ответа).
источник
np.nan
преобразования в строку"nan"
dtype
отobject
и делают это для тех , кто и обрабатывать другие типы по- разному , как это необходимо. В идеалеfillna(None)
было бы потрясающе.Благодарим этого парня за этот вопрос с Github .
источник
df.replace({np.nan: None})
как временный объектВы можете заменить
nan
сNone
вашей Numpy массива:источник
dtype
,x.dtype
isdtype('float64')
, whiley.dtype
isdtype('object')
.После спотыкания это сработало для меня:
источник
Просто дополнение к ответу @Andy Hayden:
Поскольку
DataFrame.mask
это противоположный двойникDataFrame.where
, у них точно такая же сигнатура, но с противоположным значением:DataFrame.where
полезен для замены значений, когда условие ложно .DataFrame.mask
используется для замены значений, если условие истинно .Итак, в этом вопросе использование
df.mask(df.isna(), other=None, inplace=True)
может быть более интуитивным.источник
Еще одно дополнение: будьте осторожны при замене кратных и преобразовании типа столбца обратно из объекта в число с плавающей запятой . Если вы хотите быть уверены, что ваш
None
's не вернется к предложениюnp.NaN
' apply @andy-hayden 'с использованиемpd.where
. Иллюстрация того, как замена может пойти не так:источник
.replace({np.nan: None})
replace({np.nan: None})
. Мой комментарий был добавлен, чтобы указать на потенциальную ловушку при заменеnp.nan
's. Вышеупомянутое, безусловно, немного сбило меня с толку!Довольно старый, но я наткнулся на ту же проблему. Попробуйте сделать это:
источник