欢迎访问个人博客http://www.jkraise.top
一,数据预处理
准备工作
首先 安装pandas
pip install pandas
导包 pandas
import pandas as pd
加载 数据集,代码如下
data = pd.read_csv('../data/move.csv')
Pandas 提供了一些选择的方法,
-
查看一列的一些基本统计信息:
data.columnname.describe()
-
选择一列:
dada['columnname']
-
选择一列的前几行数据:
data['columnname'][:n]
-
选择多列:
data[['column1', 'column2']]
-
Where 条件过滤:
data[data['columnname'] > condition]
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" 进行替换,
# 添加默认值 '' # data.country= data.country.fillna('')
-
使用数字类型的数据(计算电影的平均值)
data.duration = data.duration.fillna(data.duration.mean())
如果想了解更多 fillna() 的详细信息参考pandas.DataFrame.fillna。
删除不完整的行
假设,我们想删除任何有缺失值的行,这种操作太据侵略性,但是我们可以根据的我们的需要进行扩展
-
删除任何包含NA值的行
data.dropna()
-
当然我们可以删除一整行的值为NA:
data.dropna(how='all')
-
我们可以加条件,在一行中有多少非空值的数据是可以保留下来的(例子中,行数据中至少有5个非空值)
data.drop(thresh=5)
-
比如说,我们不想要不知道电影上映时间的数据:
data.dropna(subset=['title_year'])
上面的subset 参数允许我们选择想要检查的列,如果是多个列,可以使用列名的list 作为参数
删除不完整的列
我们可以使用axis=1 参数,这个意思就是操作列而不是行,(如果我们不传参数axis,默认是axis=0)
-
删除一整列为NA的列:
data.drop(axis=1, how='all')
-
删除任何包含空值的列
data.drop(axis=1,how='any')
这里也可以使用上面一样的threshold 和subset 更多的详情和案例,请参考pandas.DataFrame.dropna。
规范化数据类型
#数据类型转换:字符串转换为日期
#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)
调整后
修改列名
#建立字典字典:旧列名和新列名对应关系
colNameDict = {'InvolceDate':'SaleDate','StockCode':'StockNo'}
#!! ⚠️一定要旧列名放在冒号前
#每组对应关系以[逗号]隔开
salesDf.rename(columns = colNameDict,inplace=True)
选择部分子集
#选择子集,选择其中一列
subDataDF1=DataDF["InvoiceDate"]
#选择子集,选择其中两列
subDataDF1=DataDF[["InvoiceDate","UnitPrice"]]
利用切片筛选数据功能 df.loc
subDataDF1=DataDF.loc[:,"InvoiceDate"]
subDataDF1
#单一个冒号意味着不作限制的全选
subDataDF2=DataDF.loc[0:9,:]
subDataDF2
subDataDF3=DataDF.loc[1:9,"StockCode":"CustomerID"]
subDataDF3
逻辑问题需要筛选
还是Dataframe.loc这个函数的知识点。
由于loc还可以判断条件是否为True
DataDF.loc[:,'UnitPrice']>0
#删除异常值:通过条件判断筛选出数据
#查询条件
querySer=DataDF.loc[:,'Quantity']>0
#应用查询条件
print('删除异常值前:',DataDF.shape)
DataDF=DataDF.loc[querySer,:]
print('删除异常值后:',DataDF.shape)
格式化处理
str().
upper()
lower()
title()
lstrip()
strip()
DataDF['Description']= DataDF['Description'].str.strip()
空格分割
#定义函数:分割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
在赋值回去
DataDF.loc[:,'InvoiceDate']=splitSaletime(DataDF.loc[:,'InvoiceDate'])
处理缺失值
# 再一次提醒检查缺失数据
DataDF.isnull().sum().sort_values(ascending=False)
去除缺失值的知识点:
DataFrame.dropna
DataFrame.dropna(axis=0, how=‘any’, thresh=None, subset=None, inplace=False)
# 默认(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 这篇知乎,侵权必删,