0%

pandas 数据清洗

pandas 数据清洗

一,数据预处理

准备工作

首先 安装pandas

1
pip install pandas

导包 pandas

1
import pandas as pd

加载 数据集,代码如下

1
data = pd.read_csv('../data/move.csv')

Pandas 提供了一些选择的方法,

  • 查看一列的一些基本统计信息: data.columnname.describe()

  • 选择一列:dada['columnname']

  • 选择一列的前几行数据:data['columnname'][:n]

  • 选择多列:data[['column1', 'column2']]

  • Where 条件过滤:data[data['columnname'] > condition]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import pandas as pd


    data = pd.read_csv('movie_metadata.csv')
    # 打印 前5行数据
    # print(data.head())

    # 打印 某列 前5行
    # print(data['director_name'][:5])

    # 打印 多列 数据
    # print(data[['director_name', 'aspect_ratio']])

    # 打印 多列 5行 数据
    # print(data[['director_name', 'aspect_ratio']][:5])


处理缺失数据

一般有这几个方法,

  • 为缺失数据赋值默认值

  • 去掉/删除缺失数据行

  • 去掉/删除缺失率高的列

添加默认值

  • 我们去掉NaN值,我们检查了“country”列,这一列表示地区,然而有一些电影没有提供地区,我们将 ”country“ 整个列,使用 “” 空字符串替换了,或者,我们可以使用”None Given” 进行替换,

    1
    2
    # 添加默认值 ''
    # data.country= data.country.fillna('')
  • 使用数字类型的数据(计算电影的平均值)

    1
    data.duration = data.duration.fillna(data.duration.mean())

    如果想了解更多 fillna() 的详细信息参考pandas.DataFrame.fillna

删除不完整的行

假设,我们想删除任何有缺失值的行,这种操作太据侵略性,但是我们可以根据的我们的需要进行扩展

  • 删除任何包含NA值的行

    1
    data.dropna()
  • 当然我们可以删除一整行的值为NA:

    1
    data.dropna(how='all')
  • 我们可以加条件,在一行中有多少非空值的数据是可以保留下来的(例子中,行数据中至少有5个非空值)

    1
    data.drop(thresh=5)
  • 比如说,我们不想要不知道电影上映时间的数据:

    1
    data.dropna(subset=['title_year'])

    上面的subset 参数允许我们选择想要检查的列,如果是多个列,可以使用列名的list 作为参数

删除不完整的列

我们可以使用axis=1 参数,这个意思就是操作列而不是行,(如果我们不传参数axis,默认是axis=0)

  • 删除一整列为NA的列:

    1
    data.drop(axis=1, how='all')
  • 删除任何包含空值的列

    1
    data.drop(axis=1,how='any')

    这里也可以使用上面一样的threshold 和subset 更多的详情和案例,请参考pandas.DataFrame.dropna

规范化数据类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#数据类型转换:字符串转换为日期
#errors='coerce' 如果原始数据不符合日期的格式,转换后的值为空值NaT

DataDF.loc[:,'InvoiceDate']=pd.to_datetime(DataDF.loc[:,'InvoiceDate'],
format='%d/%m/%Y',
errors='coerce')

#!!⚠️ format 是你[原始数据]中日期的格式

%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00-59)
%S 秒(00-59)

1606058177255

调整后

1606058204326

修改列名

1
2
3
4
5
6
7
8

#建立字典字典:旧列名和新列名对应关系
colNameDict = {'InvolceDate':'SaleDate','StockCode':'StockNo'}

#!! ⚠️一定要旧列名放在冒号前
#每组对应关系以[逗号]隔开

salesDf.rename(columns = colNameDict,inplace=True)

选择部分子集

1
2
3
4
5
6
#选择子集,选择其中一列
subDataDF1=DataDF["InvoiceDate"]


#选择子集,选择其中两列
subDataDF1=DataDF[["InvoiceDate","UnitPrice"]]

** 利用切片筛选数据功能 df.loc **

loc资料,文档

1
2
3
subDataDF1=DataDF.loc[:,"InvoiceDate"]
subDataDF1
#单一个冒号意味着不作限制的全选

1606059005058

1606059218685

1
2
subDataDF2=DataDF.loc[0:9,:]
subDataDF2

1606059255274

1
2
subDataDF3=DataDF.loc[1:9,"StockCode":"CustomerID"]
subDataDF3

1606059322603

逻辑问题需要筛选

还是Dataframe.loc这个函数的知识点。

由于loc还可以判断条件是否为True

1
DataDF.loc[:,'UnitPrice']>0

1606059397428

1
2
3
4
5
6
7
#删除异常值:通过条件判断筛选出数据
#查询条件
querySer=DataDF.loc[:,'Quantity']>0
#应用查询条件
print('删除异常值前:',DataDF.shape)
DataDF=DataDF.loc[querySer,:]
print('删除异常值后:',DataDF.shape)

1606059510619

格式化处理

1
2
3
4
5
6
7
8
str().
upper()
lower()
title()
lstrip()
strip()

DataDF['Description']= DataDF['Description'].str.strip()

空格分割

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#定义函数:分割InvoiceDate,获取InvoiceDate
#输入:timeColSer InvoiceDate这一列,是个Series数据类型
#输出:分割后的时间,返回也是个Series数据类型

def splitSaletime(timeColSer):
timeList=[]
for value in timeColSer:
#例如2018/01/01 12:50,分割后为:2018-01-01
dateStr=value.split(' ')[0]
timeList.append(dateStr)
#将列表转行为一维数据Series类型
timeSer=pd.Series(timeList)
return timeSer


在赋值回去

1
DataDF.loc[:,'InvoiceDate']=splitSaletime(DataDF.loc[:,'InvoiceDate']) 

处理缺失值

1
2
3
# 再一次提醒检查缺失数据

DataDF.isnull().sum().sort_values(ascending=False)

去除缺失值的知识点:

DataFrame.dropna

DataFrame.dropna(axis=0, how=’any’, thresh=None, subset=None, inplace=False)

1
2
3
4
5
6
7
8
9
# 默认(axis=0)是逢空值剔除整行,设置关键字参数axis=1表示逢空值去掉整列
# 'any'如果一行(或一列)里任何一个数据有任何出现Nan就去掉整行,
‘all’一行(或列)每一个数据都是Nan才去掉这整行

DataDF.dropna(how='any')
DataDF.dropna(how='all')

# 更精细的thresh参数,它表示留下此行(或列)时,要求有多少[非缺失值]
DataDF.dropna(thresh = 6 )

以上内容,参考于https://zhuanlan.zhihu.com/p/32572237 这篇知乎,侵权必删,

以上内容,参考于https://zhuanlan.zhihu.com/p/60241672 这篇知乎,侵权必删,

------ 本文结束------

欢迎关注我的其它发布渠道