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

什么好主意吗?


当前回答

另一个补充:在替换倍数和将列的类型从object转换回float时要小心。如果你想确保你的None不会翻回np。NaN使用@andy-hayden的建议使用pd.where。 说明替换仍然可能出错:

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: df = pd.DataFrame({"a": [1, np.NAN, np.inf]})

In [4]: df
Out[4]:
     a
0  1.0
1  NaN
2  inf

In [5]: df.replace({np.NAN: None})
Out[5]:
      a
0     1
1  None
2   inf

In [6]: df.replace({np.NAN: None, np.inf: None})
Out[6]:
     a
0  1.0
1  NaN
2  NaN

In [7]: df.where((pd.notnull(df)), None).replace({np.inf: None})
Out[7]:
     a
0  1.0
1  NaN
2  NaN

其他回答

这招对我很管用:

df = df.fillna(0)

有时使用此代码更好。注意np指的是numpy:

df = df.fillna(np.nan).replace([np.nan], [None])

很老了,但我偶然发现了同样的问题。 试着这样做:

df['col_replaced'] = df['col_with_npnans'].apply(lambda x: None if np.isnan(x) else x)

现在对我来说,徒手做是唯一可行的方法。

@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值。

还有另一个选择,它确实对我有用:

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