我试图写一个熊猫数据帧(或可以使用numpy数组)到mysql数据库使用MysqlDB。MysqlDB似乎不理解'nan',我的数据库抛出一个错误,说nan不在字段列表中。我需要找到一种方法将“nan”转换为NoneType。
什么好主意吗?
我试图写一个熊猫数据帧(或可以使用numpy数组)到mysql数据库使用MysqlDB。MysqlDB似乎不理解'nan',我的数据库抛出一个错误,说nan不在字段列表中。我需要找到一种方法将“nan”转换为NoneType。
什么好主意吗?
当前回答
有时使用此代码更好。注意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(反之亦然)。
另一个补充:在替换倍数和将列的类型从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.astype(object).where(pd.notnull(df),None)
很老了,但我偶然发现了同样的问题。 试着这样做:
df['col_replaced'] = df['col_with_npnans'].apply(lambda x: None if np.isnan(x) else x)
我相信最干净的方法是使用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)
]