Python DataFrame替换空值/NaN为None存数据库时变为字符串"None"的问题
解决DataFrame空值/空字符串转None存数据库为NULL的问题
你的代码问题出在先把列转成了字符串类型(astype(str)),字符串列里无法存储Python的None,pandas会自动把None转成字符串"None",所以数据库里存的是字符串而非NULL。
下面是两种靠谱的解决方法:
方法一:逐元素精准处理
直接针对每个元素判断,处理NaN和strip后的空字符串,同时保留有效字符串的格式:
import pandas as pd target_cols = ['column1', 'column2', 'column3'] for col in target_cols: df[col] = df[col].apply( lambda x: None if pd.isna(x) or (isinstance(x, str) and x.strip() == '') else x.strip() if isinstance(x, str) else x )
方法二:批量替换更简洁
先把空字符串转成NaN,再统一把NaN替换为None:
import pandas as pd import numpy as np target_cols = ['column1', 'column2', 'column3'] # 先给所有字符串去空格,空字符串转成NaN df[target_cols] = df[target_cols].apply(lambda x: x.str.strip().replace('', np.nan)) # 把NaN替换为None,确保列是object类型 df[target_cols] = df[target_cols].astype(object).where(df[target_cols].notna(), None)
如果用pandas 1.0及以上版本,还可以用nullable字符串类型(更规范):
import pandas as pd target_cols = ['column1', 'column2', 'column3'] # 转为支持空值的字符串类型 df[target_cols] = df[target_cols].astype(pd.StringDtype()) # 去空格后把空字符串转成pd.NA df[target_cols] = df[target_cols].str.strip().replace('', pd.NA) # 转成None适配数据库驱动 df[target_cols] = df[target_cols].replace(pd.NA, None)
处理后,DataFrame里的对应值是Python原生的None,数据库驱动会自动把它转换成SQL的NULL存入数据库。
内容的提问来源于stack exchange,提问作者Py Ton
相关产品推荐
相关产品推荐

