Python数据分析——数据清洗及特征处理
数据清洗及特征处理
-
数据清洗
-
- 缺失值观察与处理
- 重复值观察与处理
-
特征处理
-
- 分箱处理
- 对文本变量进行转换
数据清洗
原始数据当中经常会有很多缺失值、异常值等,需要经过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗。
缺失值观察与处理
(一)缺失值观察
#查看数据属性
data.info()
#按列统计缺失值
data.isna().sum()
#同时观察多列数据
data[['Age','Cabin','Embarked']]
(二)缺失值处理
缺失值处理可分为两个部分,一个是直接删除,如:dropna()函数;另一个是填充的方式,如fillna()函数。
DataFrame.dropna(self, axis=0, how=‘any’, thresh=None, subset=None, inplace=False)
- axis:{0,1}是否删除包含缺失值的行或列,0表示行,1表示列
- how:{‘any’,‘all’}'any’表示存在NA,则删除行或列,‘all’表示所有值均为NA则删除行或列
data_1 = data['Age'].dropna()
data[data['Age']==np.isnan(np.nan)]=0
#isunull能较好填充,但是是含缺失值的行数据均填充为0
data[data['Age'].isnull()]=0
data.dropna()
**DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, kwargs)
- value:用于填充缺失值(例如0),或者指定值来进行填充
- method: {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}默认值为None,前两种是向前填充,之后两种是向后填充
data_1=data.fillna(value=0)
重复值观察与处理
(一)重复值观察
duplicated()用于标记Series中的值、DataFrame中的记录行是否是重复,重复为True,不重复为False
data.duplicated(self, subset=None, keep=‘first’)
- subset:用于识别重复的列标签或列标签序列,默认所有列标签
- keep:{‘frist’,‘last’,‘False’}first表示除了第一次出现外,其余相同的被标记为重复;Last除了最后一次出现外,其余相同的被标记为重复;False所有相同的都被标记为重复
data[data.duplicated()]
(二)重复值处理
data.drop_duplicates(self, subset=None, keep=‘first’, inplace=False)
data.drop_duplicates()
特征处理
分箱处理
**分箱处理:**是把一段连续的值切分成若干段,每一段的值看成一个分类。通常把连续值转换成离散值的过程在pandas中,cut和qcut函数都可以进行分箱处理操作。
- qcut函数则是根据数据本身的数量来对数据进行分割。
- cut()是按照数据的值进行分割
1.将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
data_cut = data.copy() #复制数据集
#查看cut()
#help(pd.cut)
data_cut['cut_group'] = pd.cut(x=data_cut['Age'],bins=5,labels=range(1,6))
data_cut
2.将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示
data_cut['cut_group'] = pd.cut(x=data_cut['Age'],bins=[0,5,15,30,50,80],labels = [1,2,3,4,5])
data_cut
3.将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示
data_cut['cut_group'] = pd.qcut(x=data_cut['Age'],q=[0,0.1,0.3,0.5,0.7,0.9],labels = [1,2,3,4,5])
data_cut
对文本变量进行转换
(一)查看数值类别
data.values:查看数据值,输出为数组
data.value_counts():可查看某列数据类别和数目
np.unique():删除重复元素,并按元素从大到小排列输出一个新的列表或元组
#第一种方法
data['Sex'].value_counts()
#第二种方法
data['Sex'].unique()
(二)文本转换
1.replace(a,b):b替换a
data['Sex_num'] = data['Sex'].replace(['male','female'],[1,2])
2.map
#data['Sex_num'] = data['Sex'].map({'male': 1, 'female': 2})
sex_dic = {'male':1,'female':0}
data['Sex_num'] = data['Sex'].map(sex_dic)
3.LabelEncoder
from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Ticket']:
lbl = LabelEncoder()
label_dict = dict(zip(data[feat].unique(), range(data[feat].nunique())))
data[feat + "_labelEncode"] = data[feat].map(label_dict)
data[feat + "_labelEncode"] = lbl.fit_transform(data[feat].astype(str))
4.从文本中提取特征
从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等
str.extract(pat, flags=0, expand=None)
可用正则从字符数据中抽取匹配的数据,只返回第一个匹配的数据
- pat:字符串或正则表达式
- flags:整型
- expand:布尔型,是否返回DataFrame
data['Title'] = data.Name.str.extract('([A-Za-z]+)\.', expand=False)
