【python学习笔记】pandas写入数据库时出现 “nan can‘t be used with mysql“ 错误的解决方法

pandas写入数据库时出错的解决方法

在使用pandas将一段数据写入数据库时,由于数据中存在NaN值,导致写入数据库出错。

这时候需要将NaN值替换成None才能写入数据库,否则会出现以下错误:

nan can't be used with mysql

为了把NaN值替换成None,在不同的pandas版本下做法是不同的。

pandas 2.0以前的版本

pandas 2.0以前的版本可以直接使用where()函数,例如:

>>> import pandas as pd
>>> import numpy as np
>>> pd.__version__
 '1.1.5'
>>> df = pd.DataFrame({'a':[1,2,3,4,5], 'b':[1,2,3,4,5]})
>>> df['a'].iloc[1] = np.nan
     a  b
0  1.0  1
1  NaN  2
2  3.0  3
3  4.0  4
4  5.0  5
>>> df.where(pd.notna(df), None) 
      a  b
0     1  1
1  None  2
2     3  3
3     4  4
4     5  5

pandas 2.0以上版本

但上面的做法在2.0以上版本的pandas不起作用,因为pandas不会主动改变一列的数据类型,如果原来的列数据类型一致,其中仅含有NaN值,这时照前面的做法,DataFrame是不会改变的:

>>> import pandas as pd
>>> import numpy as np
>>> pd.__version__
'2.0.3'
>>> df = pd.DataFrame({'a':[1,2,3,4,5], 'b':[1,2,3,4,5]})
>>> df['a'].iloc[1] = np.nan
>>> df
     a  b
0  1.0  1
1  NaN  2
2  3.0  3
3  4.0  4
4  5.0  5
>>> df.where(pd.notna(df), None)
     a  b
0  1.0  1
1  NaN  2
2  3.0  3
3  4.0  4
4  5.0  5

此时应该多一步操作,就可以得到想要的结果了:

>> df.replace(np.nan, None)
      a  b
0   1.0  1
1  None  2
2   3.0  3
3   4.0  4
4   5.0  5

但是如果A列本身数据类型就不一致,那么可以直接用where()替换:

>>> df = pd.DataFrame({'a':[1,2,3,4,5], 'b':[1,2,3,4,5]})
>>> df['a'].iloc[1] = 'None'
>>> df
      a  b
0     1  1
1  None  2
2     3  3
3     4  4
4     5  5
>>> df.where(pd.notna(df), None)
      a  b
0     1  1
1  None  2
2     3  3
3     4  4
4     5  5

2.0以前版本的pandas是否能采用2.0以上版本的方法替换成None

值得说一句,在2.0以下版本的pandas中是不能直接使用replace()的,请看:

>>> pd.__version__
 '1.1.5'
>>> df = pd.DataFrame({'a':[1,2,3,4,5], 'b':[1,2,3,4,5]})
>>> df['a'].iloc[1] = np.nan
>>> df
     a  b
0  1.0  1
1  NaN  2
2  3.0  3
3  4.0  4
4  5.0  5
>>> df.replace(np.nan, None)
     a  b
0  1.0  1
1  1.0  2  # 注意看这里,替换成None不成功
2  3.0  3
3  4.0  4
4  5.0  5

因此,如果您的代码中需要兼顾2.0以上和2.0以前的pandas,只能做版本判断并分别处理了。

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值