Numpy pandas: 使用 np.seterr(all=’raise’) 时出现浮点错误及缺失数据解决方法
在本文中,我们将介绍使用 Numpy 和 Pandas 过程中出现浮点错误以及缺失数据的问题,并针对问题提出解决思路。
阅读更多:Numpy 教程
Numpy 浮点错误及解决方法
在使用 Numpy 过程中,我们经常会用到设置浮点错误处理方式的函数 np.seterr()
。然而,在设置 np.seterr(all='raise')
(将错误信息输出)时,可能会出现以下错误:
FloatingPointError: divide by zero encountered in true_divide
这是由于在计算中除数为零时,numpy 默认会输出警告信息而不是抛出异常,但是设置了 np.seterr(all='raise')
后则会抛出异常。例如下面的代码:
import numpy as np
np.seterr(all='raise')
a = np.array([0, 1])
b = np.array([0, 0])
c = a / b
这段代码会抛出 FloatingPointError
异常。解决方法可以是将除数为零的部分赋值为 nan
,如下:
import numpy as np
np.seterr(all='raise')
a = np.array([0, 1])
b = np.array([0, 0])
b[b == 0] = np.nan
c = a / b
这样就可以避免抛出异常并得到需要的结果。
Pandas 缺失数据及解决方法
在使用 Pandas 进行数据分析时,经常会遇到缺失数据的情况。例如以下的数据表:
学号 | 姓名 | 年龄 | 成绩 |
---|---|---|---|
1001 | 张三 | 20 | 78 |
1002 | 李四 | NaN | 90 |
1003 | 王五 | 22 | NaN |
1004 | 赵六 | NaN | NaN |
缺失数据会对数据处理和分析造成影响。Pandas 可以使用 isnull()
函数判断缺失数据。例如以下代码:
import pandas as pd
data = {'学号': ['1001', '1002', '1003', '1004'],
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [20, None, 22, None],
'成绩': [78, 90, None, None]}
df = pd.DataFrame(data)
print(df.isnull())
运行结果为:
学号 姓名 年龄 成绩
0 False False False False
1 False False True False
2 False False False True
3 False False True True
可以看到,该数据表中,缺失数据分别为第二行的年龄和第三、四行的成绩,isnull()
函数判断为 True。
Pandas 中针对缺失数据还有以下函数:
dropna()
:删除含有缺失数据的行或列。fillna(value)
:根据 value 填充缺失数据。interpolate()
:根据已有数据进行插值,填充缺失数据。
例如以下代码:
import pandas as pd
data = {'学号': ['1001', '1002', '1003', '1004'],
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [20, None, 22, None],
'成绩': [78, 90, None, None]}
df = pd.DataFrame(data)
df = df.dropna(axis=0) # 删除含有缺失数据的行
print(df)
df = df.fillna(value={'年龄': 0, '成绩': 60}) # 根据字典填充缺失数据
print(df)
df = df.interpolate() # 插值填充缺失数据
print(df)
运行结果为:
学号 姓名 年龄 成绩
0 1001 张三 20 78
学号 姓名 年龄 成绩
0 1001 张三 20 78
2 1003 王五 22 60
学号 姓名 年龄 成绩
0 1001 张三 20.0 78.0
2 1003 王五 22.0 69.0
可以看到,使用 dropna()
函数删除含有缺失数据的行,使用 fillna()
函数根据字典填充缺失数据,使用 interpolate()
函数进行插值填充缺失数据,最终得到一份完整的数据表。
总结
本文介绍了使用 Numpy 和 Pandas 过程中,可能会遇到的浮点错误和缺失数据问题,并提出了解决思路。希望能够对大家的数据分析过程有所帮助。