数据清洗
首先还是导入numpy、pandas包和数据
import numpy as np
import pandas as pd
任务一:缺失值观察
然后先查找缺失值。
查找存在缺失值的列
df.isnull().any()
查找均为缺失值的列
df.isnull().all()
查找存在缺失值的行
nan_lines = df.isnull().any(1)
统计有多少行存在缺失值
nan_lines.sum()
【这些是查找资料是学到的】
题目:查看每个特征缺失值个数
df.isnull().sum()
【结果】
PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64
题目:查看Age, Cabin, Embarked列的数据
df[['Age','Cabin','Embarked']].head(3)
另外:查看有缺失值的行信息
df[nan_lines]
任务二:对缺失值进行处理
处理缺失值的思路:人为原因是由于人的主观失误、历史局限或有意隐瞒造成的数据缺失。对于这种人为因素缺失值的处理,从总体上来说分为删除缺失值和缺失值插补。
dropna()函数主要用于滤除缺失数据,即删除缺失值。
参数有以下五种:
axis:{0 or ‘index’, 1 or ‘columns’}, 默认0
how:{‘any’, ‘all’}, 默认any
thresh:int, optional
subset:array-like, optional
inplace:bool, 默认False
丢弃至少缺少一个元素的行。
df.dropna()
fillna()函数主要是使用指定方法填充 NA/NaN 值,即填充缺失值。
参数有以下六种:
value:scalar, dict, Series, or DataFrame,此值不能是列表。
method:{‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, 默认None
axis:{0 or ‘index’, 1 or ‘columns’}
inplace:bool, 默认False
limit:int, 默认None
downcast:dict, 默认是 None
将所有NaN元素替换为0s。
df.fillna(0)
检索空缺值
思考:检索空缺值用np.nan,None以及.isnull()哪个更好,这是为什么?如果其中某个方式无法找到缺失值,原因又是为什么?
Pandas 主要用 np.nan 表示缺失数据。 计算时,默认不包含空值。
数值列读取数据后,空缺值的数据类型为float64所以用None一般索引不到。
任务三:重复值观察与处理
pandas提供了两个方法专门用来处理数据中的重复值,分别为**duplicated()和drop_duplicates()**方法。其中,前者用于标记是否有重复值,后者用于删除重复值,它们的判断标准是一样的,即只要两条数据中所有条目的值完全相等,就判断为重复值。
df[df.duplicated()]
任务四:对重复值进行处理
在任务三中,有提到可以用**drop_duplicates()**方法来删除重复值。
df = df.drop_duplicates()
df.head()
任务五:将前面清洗的数据保存为csv格式
可以使用pandas.Dataframe.to_csv()函数来储存数据为csv文件。
df.to_csv('test_clear.csv')
特征值观察与处理
任务一:对年龄进行分箱(离散化)处理
1 分箱操作是什么?
分箱操作就是将连续数据转换为分类对应物的过程。
比如将连续的身数高据划分为:矮中高。
分箱操作分为等距分箱和等频分箱。
分箱操作也叫面元划分或者离散化。
2 将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示(即等宽分箱)
df['AgeGroup'] = pd.cut(df.['Age'],#分箱数据
bins = 5,#宽度
labels=['1','2','3','4','5']#分箱分类)
df.to_csv('test_ave.csv')#保存
3 将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示(指定宽度分箱)
这里需要提一下:right:bool, 默认True
right:指示bins是否包含最右边缘。如果True(默认值),则bins表示(1,2]、(2,3]、(3,4)。
df['AgeGroup'] = pd.cut(df.['Age'],#分箱数据
bins = [0,5,15,30,50,80],#分箱断点
right = False,# 左闭右开
labels=['1','2','3','4','5'])# 分箱后分类
df.to_csv('test_cut.csv')#保存
4 将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示(即等频定频分箱)
df['AgeGroup'] = pd.qcut(df.['Age'],
q = [0,0.1,0.3,0.5,0.7,0.9],# 按比例分箱
labels=['1','2','3','4','5']) # 分箱后分类
df.to_csv('test_pr.csv')#保存
以上参考:python pandas 分箱操作
任务二:对文本变量进行转换
(因查找的资料过少,不能完全理解,就先按照答案再找函数)
(1) 查看文本变量名及种类
#方法一: value_counts
df['Sex'].value_counts()
df['Cabin'].value_counts()
df['Embarked'].value_counts()
方法一:value_counts()是一种查看表格某列中有多少个不同值的快捷方法,并计算每个不同值有在该列中有多少重复值。
value_counts()是Series拥有的方法,一般在DataFrame中使用时,需要指定对哪一列或行使用
作者:tommyjex
链接:https://www.jianshu.com/p/f773b4b82c66
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
#方法二: unique
df['Sex'].unique()
#array(['male', 'female', 0], dtype=object)
df['Sex'].nunique()
#3
方法二:unique
Pandas中Series和DataFrame的两种数据类型中都有nunique()和unique()方法。这两个方法作用很简单,都是求Series或Pandas中的不同值。而unique()方法返回的是去重之后的不同值,而nunique()方法则直接放回不同值的个数。
参考:Pandas中的unique()和nunique()方法
(2) 将文本变量Sex, Cabin ,Embarked用数值变量12345表示
replace是一组一组替换
#方法一: replace
df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2])
df.head()
map是一对一的替换
#方法二: map
df['Sex_num'] = df['Sex'].map({'male': 1, 'female': 2})
df.head()
sklearn.preprocessing.LabelEncoder():标准化标签,将标签值统一转换成range(标签值个数-1)范围内
先要获取标签值,再将标签值转化,最后将将标准化的标签值反转。
#方法三: 使用sklearn.preprocessing的LabelEncoder
from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Ticket']:
lbl = LabelEncoder()
label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique())))
df[feat + "_labelEncode"] = df[feat].map(label_dict)
df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str))
df.head()
(3) 将文本变量Sex, Cabin, Embarked用one-hot编码表示
独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。
可以这样理解,对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征(如成绩这个特征有好,中,差变成one-hot就是100, 010, 001)。并且,这些特征互斥,每次只有一个激活。因此,数据会变成稀疏的。
这样做的好处主要有:
1)解决了分类器不好处理属性数据的问题
2)在一定程度上也起到了扩充特征的作用
#方法一: OneHotEncoder
for feat in ["Age", "Embarked"]:
# x = pd.get_dummies(df["Age"] // 6)
# x = pd.get_dummies(pd.cut(df['Age'],5))
x = pd.get_dummies(df[feat], prefix=feat)
df = pd.concat([df, x], axis=1)
#df[feat] = pd.get_dummies(df[feat], prefix=feat)
df.head()
任务三(附加):从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)
df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)
df.head()
df.to_csv('test_fin.csv')#保存
extract/extractall:接受正则表达式,抽取匹配的字符串(一定要加上括号)
extract搭配expand参数
参考:详解 16 个 Pandas 函数,让你的 “数据清洗” 能力提高 100 倍!
总结
第二章的第一节学习了不少梳理数据,以及各种归类数据的方法,最后两种处理特征还是有些不太理解,会再多找一些资料看看的。