我试图写一个熊猫数据帧(或可以使用numpy数组)到mysql数据库使用MysqlDB。MysqlDB似乎不理解'nan',我的数据库抛出一个错误,说nan不在字段列表中。我需要找到一种方法将“nan”转换为NoneType。
什么好主意吗?
我试图写一个熊猫数据帧(或可以使用numpy数组)到mysql数据库使用MysqlDB。MysqlDB似乎不理解'nan',我的数据库抛出一个错误,说nan不在字段列表中。我需要找到一种方法将“nan”转换为NoneType。
什么好主意吗?
当前回答
df = df.replace({np.nan: None})
注意:对于<1.4的pandas版本,这会将所有受影响列的dtype更改为object。 为了避免这种情况,请使用以下语法:
df = df.replace(np.nan, None)
这要归功于Github上的这个家伙和Killian Huyghe的评论。
其他回答
取代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(反之亦然)。
很老了,但我偶然发现了同样的问题。 试着这样做:
df['col_replaced'] = df['col_with_npnans'].apply(lambda x: None if np.isnan(x) else x)
经过一番摸索,这招对我很管用:
df = df.astype(object).where(pd.notnull(df),None)
@bogatron是对的,你可以用where,值得注意的是,你可以在熊猫的原生环境中这样做:
df1 = df.where(pd.notnull(df), None)
注意:这将所有列的dtype更改为object。
例子:
In [1]: df = pd.DataFrame([1, np.nan])
In [2]: df
Out[2]:
0
0 1
1 NaN
In [3]: df1 = df.where(pd.notnull(df), None)
In [4]: df1
Out[4]:
0
0 1
1 None
注意:你不能做的是重铸DataFrames dtype以允许所有的数据类型,使用astype,然后使用DataFrame fillna方法:
df1 = df.astype(object).replace(np.nan, 'None')
不幸的是,这和使用replace都不能与None一起工作,看到这个(关闭)问题。
顺便说一句,值得注意的是,对于大多数用例,您不需要将NaN替换为None,请参阅这个关于pandas中NaN和None之间差异的问题。
然而,在这个特定的情况下,你似乎是这样的(至少在回答这个问题的时候)。
在熊猫更新到1.3.2后,我发现推荐的答案和替代建议都不适合我的应用程序,我用蛮力方法解决了安全问题:
buf = df.to_json(orient='records')
recs = json.loads(buf)