我试图写一个熊猫数据帧(或可以使用numpy数组)到mysql数据库使用MysqlDB。MysqlDB似乎不理解'nan',我的数据库抛出一个错误,说nan不在字段列表中。我需要找到一种方法将“nan”转换为NoneType。
什么好主意吗?
我试图写一个熊猫数据帧(或可以使用numpy数组)到mysql数据库使用MysqlDB。MysqlDB似乎不理解'nan',我的数据库抛出一个错误,说nan不在字段列表中。我需要找到一种方法将“nan”转换为NoneType。
什么好主意吗?
当前回答
只是给@安迪·海登的回答补充了一句:
因为DataFrame。mask是DataFrame的孪生兄弟。其中,它们具有完全相同的签名,但含义相反:
DataFrame。where用于替换条件为False的值。 DataFrame。mask用于替换条件为True的值。
所以在这个问题中,使用df.mask(df.isna(), other=None, inplace=True)可能更直观。
其他回答
有时使用此代码更好。注意np指的是numpy:
df = df.fillna(np.nan).replace([np.nan], [None])
取代np。nan和None在不同版本的熊猫中完成的不同:
if version.parse(pd.__version__) >= version.parse('1.3.0'):
df = df.replace({np.nan: None})
else:
df = df.where(pd.notnull(df), None)
这解决了熊猫版本<1.3.0的问题,如果df中的值已经为None,则df.replace({np. replace)nan: None})将切换回np。Nan(反之亦然)。
在替换为where语句之前,将numpy NaN转换为pandas NA:
df = df.replace(np.NaN, pd.NA).where(df.notnull(), None)
我相信最干净的方法是使用pandas. datafframe .to_numpy()方法中的na_value参数(docs):
na_value:任意,可选 用于缺失值的值。默认值取决于dtype和DataFrame列的dtypes。 1.1.0新版功能。
例如,你可以使用None替换NaN的字典
columns = df.columns.tolist()
dicts_with_nan_replaced = [
dict(zip(columns, x))
for x in df.to_numpy(na_value=None)
]
现在对我来说,徒手做是唯一可行的方法。
@rodney cox的回答几乎在所有情况下都对我有效。
下面的代码将所有列设置为对象数据类型,然后将任何空值替换为None。将列数据类型设置为object非常重要,因为这样可以防止pandas进一步更改类型。
for col in df.columns:
df[col] = df[col].astype(object)
df.loc[df[col].isnull(), col] = None
警告:此解决方案效率不高,因为它处理的列可能没有np。nan值。