Loading

Pandas 数据清洗之处理空值

本文参考自菜鸟教程
数据清洗是对一些没有用的数据进行处理的过程。
即处理数据集中数据缺失、数据格式错误、错误数据或重复数据的情况。

import pandas as pd

df = pd.read_csv('./property-data.csv')
print(df.to_string())
print(df.info())

清洗空值

检查空值----isnull()

通过 Series.isnull() 判断各个单元格是否为空。
本质上 DataFrame 返回的行或者列都是 Series 类型的数据。

# 首先设置 空 的"定义"

missing_values = ['NA', 'n/a', '--', '']    # 根据 CSV 文件寻找其中 空 的形式
df = pd.read_csv('property-data.csv', na_values=missing_values) # 重新读取 csv 文件,并设置空值
# 查看第一行有没有空值
print(df.loc[2])
print('********************************')
print(df.loc[2].isnull())

PID 100003000.0
ST_NUM NaN
ST_NAME LEXINGTON
OWN_OCCUPIED N
NUM_BEDROOMS NaN
NUM_BATH 1
SQ_FT 850.0
Name: 2, dtype: object
********************************
PID False
ST_NUM True
ST_NAME False
OWN_OCCUPIED False
NUM_BEDROOMS True
NUM_BATH False
SQ_FT False
Name: 2, dtype: bool

# 查看第二列有没有空值
print(df.ST_NUM)
print('********************************')
print(df.ST_NUM.isnull())

0 104.0
1 197.0
2 NaN
3 201.0
4 203.0
5 207.0
6 NaN
7 213.0
8 215.0
Name: ST_NUM, dtype: float64
********************************
0 False
1 False
2 True
3 False
4 False
5 False
6 True
7 False
8 False
Name: ST_NUM, dtype: bool

删除空值所在的行----dropna()

dropna()方法:DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

参数说明:
  axis:默认为 0,表示逢空值剔除整行,如果设置参数 axis=1 表示逢空值去掉整列。
  how:默认为 'any' 如果一行(或一列)里任何一个数据有出现 NA 就去掉整行,
     如果设置 how='all' 一行(或列)都是 NA 才去掉这整行。

  thresh:设置需要多少非空值的数据才可以保留下来的。
  subset:设置想要检查的列。如果是多个列,可以使用列名的 list 作为参数。
  inplace:如果设置 True,将计算得到的值直接覆盖之前的值并返回 None,修改的是源数据。

print(df.to_string())

PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3 1 1000.0
1 100002000.0 197.0 LEXINGTON N 3 1.5 NaN
2 100003000.0 NaN LEXINGTON N NaN 1 850.0
3 100004000.0 201.0 BERKELEY 12 1 NaN 700.0
4 NaN 203.0 BERKELEY Y 3 2 1600.0
5 100006000.0 207.0 BERKELEY Y NaN 1 800.0
6 100007000.0 NaN WASHINGTON NaN 2 HURLEY 950.0
7 100008000.0 213.0 TREMONT Y 1 1 NaN
8 100009000.0 215.0 TREMONT Y na 2 1800.0

dfTemp = df.dropna(axis=0, how='any', subset=['PID', 'ST_NUM'], inplace=False)
            # 检查df中 subset 中的列
            # 一旦遇到空值  (how='any')
            # 就删除此行    (axis=0)
            # 不修改源数据  (inplace=False)
print(dfTemp.to_string())

PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3 1 1000.0
1 100002000.0 197.0 LEXINGTON N 3 1.5 NaN
3 100004000.0 201.0 BERKELEY 12 1 NaN 700.0
5 100006000.0 207.0 BERKELEY Y NaN 1 800.0
7 100008000.0 213.0 TREMONT Y 1 1 NaN
8 100009000.0 215.0 TREMONT Y na 2 1800.0

替换空值单元格----fillna()

一般指定某一列,当此列中出现空值时,使用此列的均值mean()中位数medium()众数mode()来替代空值单元格。

print(df.to_string())

PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3 1 1000.0
1 100002000.0 197.0 LEXINGTON N 3 1.5 NaN
2 100003000.0 NaN LEXINGTON N NaN 1 850.0
3 100004000.0 201.0 BERKELEY 12 1 NaN 700.0
4 NaN 203.0 BERKELEY Y 3 2 1600.0
5 100006000.0 207.0 BERKELEY Y NaN 1 800.0
6 100007000.0 NaN WASHINGTON NaN 2 HURLEY 950.0
7 100008000.0 213.0 TREMONT Y 1 1 NaN
8 100009000.0 215.0 TREMONT Y na 2 1800.0

# 对 ST_NUM 列的空值,使用此列的均值替换,并修改源数据df

df.ST_NUM.fillna(df.ST_NUM.mean(), inplace=True)
print(df)

PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH
0 100001000.0 104.000000 PUTNAM Y 3 1
1 100002000.0 197.000000 LEXINGTON N 3 1.5
2 100003000.0 191.428571 LEXINGTON N NaN 1
3 100004000.0 201.000000 BERKELEY 12 1 NaN
4 NaN 203.000000 BERKELEY Y 3 2
5 100006000.0 207.000000 BERKELEY Y NaN 1
6 100007000.0 191.428571 WASHINGTON NaN 2 HURLEY
7 100008000.0 213.000000 TREMONT Y 1 1
8 100009000.0 215.000000 TREMONT Y na 2

SQ_FT
0 1000.0
1 NaN
2 850.0
3 700.0
4 1600.0
5 800.0
6 950.0
7 NaN
8 1800.0

posted @ 2022-05-23 17:51  Lowell_liu  阅读(1763)  评论(0)    收藏  举报