в которой либо int либо пусто (<NA>)
по умолчаню панда парсит ее как float64
в таком случае при апдейте бд получаю ошибку:
sqlalchemy.exc.StatementError: (builtins.ValueError) cannot convert float NaN to integer
если делаю df['Номер заказа'] = df['Номер заказа'].astype(pd.Int32Dtype()), получаю ошибку:
sqlalchemy.exc.InterfaceError: (sqlite3.InterfaceError) Error binding parameter 12 - probably unsupported type.
пробовал сделать df['Номер заказа'].fillna(value={pd.NA: None}, inplace=True)
получаю ту же ошибку:
sqlalchemy.exc.InterfaceError: (sqlite3.InterfaceError) Error binding parameter 12 - probably unsupported type.
подскажите что еще можно сделать с колонкой?
попробуй юзать numpy.nan
кроме того, у тебя в БД разрешены Null?
попробовал, тоже самое(
как вариант, можешь еще заменить все NaN на -99999999, а потом в бд их заменить на null
долго, там десятки тысяч строк
в смысле? это занимает секунду
вот я как раз и переписываю для того, чтобы бстрее работало) до этого были костыли всякие, некотоыре запросы по 2 сек обрабатывались, мне кажется это долго
эх....мои 40 минутные скрипты плачут...
https://stackoverflow.com/questions/47333227/pandas-valueerror-cannot-convert-float-nan-to-integer
из этой статьи выглядит так, будто твой NaN это не пустота, а текст
на сколько я понимаю нан это флоат
не, nan это вообще ничего
cannot convert float NaN to integer
вот реально хз, без бд и датасета тяжело что-то сказать(
Так дело в sqlite3+alchemy
с пг еще не пробовал, пока тестирую на скулайт
попробую попозже, спс
В других случаях Νone хранит?
бд хранит или int или None
Попробуй sqlalchemy.null().
если руками напистаь None - все работает, но у меня 15 колонок и несколько таблиц, поэтому я хотел напистаь одну функцию для апдейта разных таблиц из датафрейма, и делаю вот так def update_existing(conn: sa.engine.Connection, df, existing_rows): for _, row in df[df['id'].isin(existing_rows)].iterrows(): conn.execute(table.update().where(table.c.id == row['id']).values(**row.to_dict()))
кстаи вот из кода numpy: nan: Final[float]
Почему бы просто не fillna(None, inplace = True).
он все равно заменяет на NA а во-вторых def fillna( self, value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, ) -> Optional["Series"] там итак значение по умолчанию None и он будет ругаться, что надо указать аргумент
я думаю он имел в виду не None а "None"
в таком случае будет TypeError: <U4 cannot be converted to an IntegerDtype
Тогда применять всё это не имело смысла. Если поставить dtype object, прекрасно хранит None
но ругается когда делаешь update колонки в базе с типом int
Он у тебя и так ругается.
да, и я пофиксил по-другому, написал же выше
Это всё равно костыли. Были где-то нормальные методы pandas -> sqlite3.
да, костыли( нормальные методы есть только для insert к сожалению я ковырял код pandas.to_sql(), но пока что чет не разобрался как это у них происходит
Обсуждают сегодня