数据清洗与准备(1)

2023-02-23 21:16:23 浏览数 (1)

在进行数据分析和建模过程中,大量时间花费在数据准备上:加载、清洗、转换和重新排列,这样的工作占用了分析师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可以保留一定数量的观察值的行

处理缺失值是数据分析的第一步,下一篇文章将介绍补全缺失值和数据转换的相关内容。

0 人点赞