在进行数据分析和建模过程中,大量时间花费在数据准备上:加载、清洗、转换和重新排列,这样的工作占用了分析师80%以上的时间。本章将讨论用于缺失值、重复值、字符串操作和其他数据转换的工具。
1、处理缺失值
缺失数据在数据分析中很容易出现,在pandas中使用NaN表示缺失值,称NaN为容易检测到的缺失值;同时python内建的None值在对象数组中也会被当做NA处理:
代码语言:javascript复制import numpy as np
import pandas as pd
series1 = pd.Series(['Name', 'Gender', 'Age', np.nan, None, 'score'])
-----结果-----
0 False
1 False
2 False
3 True
4 True
5 False
NA的一些处理方法如下:
NA处理方法表
方法 | 描述 |
---|---|
dropna | 根据每个标签的值是否为缺失数据来筛选轴标签,并允许根据丢失的数据量确定阈值 |
fillna | 用某些值填充缺失的数据值或使用插值方法,如ffill或bfill |
isnull | 返回表明哪些值是缺失值 |
notnull | 作用域isnull相反 |
(1)过滤缺失值
有多种过滤缺失值的方法,虽然可以用pandas.isnull手动过滤,但是dropna在过滤缺失值上更为有用,在series上使用dropna,它会返回series中的所有非空数据及其索引值。
代码语言:javascript复制from numpy import nan as NA
data = pd.Series([1, NA, 3.5, NA, 7])
data.dropna() #与data[data.notnull()]等价
-----结果-----
0 1.0
2 3.5
4 7.0
当处理DataFrame对象的时候,可能会复杂一点,可能想要删除全部为NA的列或者含有NA的行或列,dropna默认情况下会删除包含缺失值的行:
代码语言:javascript复制data = pd.DataFrame([[1, 2.5, 3], [1, NA, NA],
[NA, NA, NA], [NA, 5.2, 6]])
cleaned = data.dropna()
print(data)
print(cleaned)
-----结果-----
data:
0 1 2
0 1.0 2.5 3.0
1 1.0 NaN NaN
2 NaN NaN NaN
3 NaN 5.2 6.0
cleaned:
0 1 2
0 1.0 2.5 3.0
传入how="all"删除所有值均为NA的行;传入axis=1,可以删除均为NA的列。
代码语言:javascript复制data.dropna(how = "all")
-----结果-----
0 1 2
0 1.0 2.5 3.0
1 1.0 NaN NaN
3 NaN 5.2 6.0
代码语言:javascript复制data[3] = NA
cleaned = data.dropna(how = 'all', axis = 1)
print(data)
print(cleaned)
-----结果-----
data:
0 1 2 3
0 1.0 2.5 3.0 NaN
1 1.0 NaN NaN NaN
2 NaN NaN NaN NaN
3 NaN 5.2 6.0 NaN
cleaned:
0 1 2
0 1.0 2.5 3.0
1 1.0 NaN NaN
2 NaN NaN NaN
3 NaN 5.2 6.0
过滤DataFrame的行的相关方法往往涉及时间序列数据,我们也可以传入thresh参数保留一定数量的行:
代码语言:javascript复制df = pd.DataFrame(np.random.randn(7, 3))
df.iloc[:4, 1] = NA #根据轴索引赋值
df.iloc[:2, 2] = NA
print(df)
print(df.dropna())
print(df.dropna(thresh = 2)) #保留2个观察值
-----结果-----
df:
0 1 2
0 0.604888 NaN NaN
1 -0.337529 NaN NaN
2 0.423364 NaN -0.755305
3 0.575907 NaN 0.015249
4 0.204847 -0.718295 0.612700
5 0.660646 -0.102224 -1.245912
6 0.689484 0.610255 0.648971
df.dropna():
0 1 2
4 0.204847 -0.718295 0.612700
5 0.660646 -0.102224 -1.245912
6 0.689484 0.610255 0.648971
df.dropna(thresh=2):
0 1 2
2 0.423364 NaN -0.755305
3 0.575907 NaN 0.015249
4 0.204847 -0.718295 0.612700
5 0.660646 -0.102224 -1.245912
6 0.689484 0.610255 0.648971
总结:
(1)处理缺失值常用dropna()方法,默认删除含有缺失值的行
(2)传入how="all"可以删除全部为缺失值的行
(3)传入axis=1可以删除列
(4)传入thresh可以保留一定数量的观察值的行
处理缺失值是数据分析的第一步,下一篇文章将介绍补全缺失值和数据转换的相关内容。