我试图写一个熊猫数据帧(或可以使用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)可能更直观。
其他回答
另一个补充:在替换倍数和将列的类型从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
只是给@安迪·海登的回答补充了一句:
因为DataFrame。mask是DataFrame的孪生兄弟。其中,它们具有完全相同的签名,但含义相反:
DataFrame。where用于替换条件为False的值。 DataFrame。mask用于替换条件为True的值。
所以在这个问题中,使用df.mask(df.isna(), other=None, inplace=True)可能更直观。
在熊猫更新到1.3.2后,我发现推荐的答案和替代建议都不适合我的应用程序,我用蛮力方法解决了安全问题:
buf = df.to_json(orient='records')
recs = json.loads(buf)
很老了,但我偶然发现了同样的问题。 试着这样做:
df['col_replaced'] = df['col_with_npnans'].apply(lambda x: None if np.isnan(x) else x)
df = df.replace({np.nan: None})
注意:对于<1.4的pandas版本,这会将所有受影响列的dtype更改为object。 为了避免这种情况,请使用以下语法:
df = df.replace(np.nan, None)
这要归功于Github上的这个家伙和Killian Huyghe的评论。