前言:数据清洗
我们拿到的数据通常是不干净的,所谓的不干净,就是数据中有缺失值,有一些异常点等,需要经过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗。
学习内容:缺失值、重复值、字符串和数据转换
一、查看缺失值
data.isnull() #缺失值的地方返回true
data.isnull().sum() #返回每列缺失值的个数
data.info() #返回内容更详细,返回每列不是缺失值的个数,以及总行数
二、对缺失值进行处理
滤除缺失数据
data.dropna() #丢弃有缺失值的行
data.dropna(how = 'all') #丢弃全为NA的行
#丢弃列,传入'axis = 1'
填充缺失数据
data.fillna(0) #讲缺失值填充为0,默认返回新对象
data.fillna(0,inplace = true) #对现有对象就地修改
data.fillna(data.mean()) #用每列的均值填充
data.fillna(data.median()) #用每列的中位数填充
data['name'].fillna(data['name'].mean()) #对name列用name列的均值填充
三、查看重复值
data.duplicated() #判断各行是否为重复行(前面出现过的行)
data.drop_duplicates() #返回DataFrame,重复行标为False
四、数据分箱(对连续变量离散化)
均等分
data['new_columns_name'] = pd.cut(data['columns_name'],5,labels = [1,2,3,4,5])
#pd.cut(data['columns_name'],均等分的份数,分箱后的标签名)
指定区间划分
data['new_columns_name'] = pd.cut(data['columns_name'],[0,5,15,30,50,80],labels = [1,2,3,4,5])
#pd.cut(data['columns_name'],人为设定划分的区间点,划分后的标签)
按照百分比划分
data['new_columns_name'] = pd.qcut(data['columns_name'],[0,0.1,0.3,0.5,0.7,0.9],labels = [1,2,3,4,5])
#pd.qcut(data['columns_name'],人为设定划分百分比(用小数表示),划定后的标签)
查看每列数据的类别
data['columns_name'].value_counts() #查看该列数据,每种出现了多少次
data['columns_name'].unique() #以数组形式返回列的所有唯一值
data['columns_name'].nunique() #返回所有唯一值的个数
改变类别文本
data['new_columns_name'] = data['columns_name'].replace(['male','female'],[1,2])
#data['columns_name'].replace([原种类名],[要替换成的新名])
data['columns_name'] = data['columns_name'].map({'male': 1, 'female': 2})
#data['columns_name'].map({'原种类名': 要替换成的新名, '原种类名': 要替换成的新名}),以字典的形式
将文本标签转化为数字
zip()
a = [1,2,3,4]
b = [5,6,7,8]
zipped = zip(a,b)
print(dict(zipped))
astype()转换数据类型
五、正则表达式
数据重构
一、数据合并
concat
list = [a,b]
result = pd.concat(list) #默认纵向合并,横向合并输入参数axis = 1
数据集的合并(join,append)
join:索引合并。
append:上下拼
merge
stack:将列旋转到行,旋转后是serise类型的数据
二、group by
s = df['column_name'].groupby(result['key']) #按照key分类,取column_name的数据
df.groupby(by = 'key').agg({'columns_name1' : 'mean','columns_name2' : 'sum'})
#按照key列分类,对columns_name1的数据求均值,对columns_name2的数据求和,agg()里是字典的形式
#在其后使用.rename(columns={})可以修改列标签名称