我试图写一个熊猫数据帧(或可以使用numpy数组)到mysql数据库使用MysqlDB。MysqlDB似乎不理解'nan',我的数据库抛出一个错误,说nan不在字段列表中。我需要找到一种方法将“nan”转换为NoneType。

什么好主意吗?


当前回答

在替换为where语句之前,将numpy NaN转换为pandas NA:

df = df.replace(np.NaN, pd.NA).where(df.notnull(), None)

其他回答

df = df.replace({np.nan: None})

注意:对于<1.4的pandas版本,这会将所有受影响列的dtype更改为object。 为了避免这种情况,请使用以下语法:

df = df.replace(np.nan, None)

这要归功于Github上的这个家伙和Killian Huyghe的评论。

只是给@安迪·海登的回答补充了一句:

因为DataFrame。mask是DataFrame的孪生兄弟。其中,它们具有完全相同的签名,但含义相反:

DataFrame。where用于替换条件为False的值。 DataFrame。mask用于替换条件为True的值。

所以在这个问题中,使用df.mask(df.isna(), other=None, inplace=True)可能更直观。

这招对我很管用:

df = df.fillna(0)

经过一番摸索,这招对我很管用:

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

在熊猫更新到1.3.2后,我发现推荐的答案和替代建议都不适合我的应用程序,我用蛮力方法解决了安全问题:

buf = df.to_json(orient='records')
recs = json.loads(buf)