datawhale-动手学数据分析task2笔记
动手学数据分析task2
数据清洗及特征处理
缺失值观察与处理
-
.isnull()
和.isna()
可判断表中所有缺失值,缺失值处为True,优先用.isna()
。 -
.isna().sum()
可以获得columns的缺失值数量。 -
.info()
可以获得dataframe中columns的non-null
值,从而推断出缺失值数量。 -
.dropna()
方法可以处理dataframe数据的缺失值,对缺失值行或者列删除。''' 参数说明: axis=0/1,0删除行 how='any'/'all'即筛选方式,any为有Nan即删,all则是全为Nan才会删除 tresh=None/int,其中为非空元素最低数量,如果行/列元素数量小于tresh的值则会删除 subset=None/list,其中为筛选的columns或index,作用是筛选判断范围 inplace=Bool,如果True则替换原dataframe ignore_index=Bool, 如果True则会在删除缺失值后重置索引 ''' #以下为参数的默认值 df.dropna(axis=0, how='any', tresh=None, subset=None, inplace=False, ignore_index=False)
-
.fillna()
方法可以处理dataframe数据的缺失值,对缺失值进行填充。''' 参数说明: value=None/any,其值是填充缺失值的值 method='bfill'/'ffill'/None即填充方法,ffill表示用前面行/列的值,bfill表示用后面行/列的值,填充当前行/列的空值 (目前已不推荐method参数,可以用.ffill()和.bfill()代替,但其无limit参数) axis=0/1,沿其填充缺失值的轴 limit=None/int,是填充连续缺失值的最大数量(与method方法一起用,所以也不推荐) inplace=Bool,如果True则替换原dataframe ''' # 以下参数为默认参数 df.fillna(value=None, method=None, axis=None, inplace=False, limit=None)
-
三种简单方法填充缺失值。
# method1 >>> df[df.isna()] = 1 >>> pd.isna(np.nan) # True >>> np.nan == np.nan # False >>> np.nan is np.nan # True # None != NaN
-
检索空值最好用isna(),理由如上。
重复值观察与处理
-
.duplicated()
方法可以找出表中数据的重复值。''' 参数说明: subset=None/list,是需要标记重复的标签或标签序列 keep='first'/'last'/'False',是重复数据的标记方法。 first将除第一次出现以外的重复数据标记为True,last将除最后一次出现以外的重复数据标记为True, False将所有重复数据标记为True。 ''' # 以下参数为默认参数 df.duplicated(subset=None, keep='first')
-
drop_duplicates()
方法可以删除表中数据的重复值。''' 参数说明: subset=None/list,是需要标记重复的标签或标签序列 keep='first'/'last'/'False',是重复数据的标记方法,同duplicated()。 inplace=Bool,是是否替代。 ''' # 以下参数为默认参数 df.drop_duplicates(subset=None, keep='first', inplace=False)
特征观察与处理
-
数据分箱(分桶/离散化)指的是以特定的条件将所有元素分类,实现数据的离散化,增强数据的稳定性。本质上就是把数据进行分组。
-
进行数据分箱的三种方法。
-
loc & between
''' 参数说明: 将column中所有数据大小在bin(r1, r2)中的数据进行增添新label,需要对每个bin编写分箱代码,所以一般都是bin很少时使用。 between()函数中left为左边界,right为右边界,inclusive为是否包含哪个边界。 inclusive='left'/'right'/'both',可省略三个关键词。 ''' df.loc[df['column'].between(left=r1, right=r2, inclusive='both'), 'new_column'] = 'label'
-
cut
''' 参数说明: - x=df.['column'],是要分箱的column,必须是一维的。 - right=Bool,是否包含最右边的边缘。 - bins=list/number,list中元素是分箱每个bin的范围或number表示几分位数。 - labels=list,list中是指定返回的bin的标签。必须与上面的 bins 参数长度相同(一一对应)。 - include_lowest=Bool 第一个区间是否应该是左包含的。 - precision=int 精度,表示小数几位。 - duplicates=default/'raise'/'drop',如果bin边缘不是唯一的,'raise'则引发 ValueError而'drop'删除非唯一的。 - retbins=Bool,是否返回bin的边界list。 - ordered=Bool,表示标签是否有序。 ''' # 以下有具体值的为默认值 df['new_column'] = pd.cut(x=df['column'], right=True, bins = [range], labels = [label], include_lowest = False, precision=3, duplicates=default, retbins=False, ordered=True)
-
qcut
''' 参数说明: - x=df['column'],是要分箱的column,必须是一维的。 - q=number/list,number表示几分位数,4表示四分位数等。list是分数list,例如[0, .25, .5, .75, 1.] 四分位数。 - labels=list,list中是指定返回的bin的标签。必须与上面的 bins 参数长度相同(一一对应)。 - retbins=Bool,是否返回bin的边界list。 - precision=int,精度,表示小数几位。 - duplicates=default/'raise'/'drop',如果bin边缘不是唯一的,'raise'则引发 ValueError而'drop'删除非唯一的。 ''' # 以下有具体值的为默认值 df['new_column'],cut_bin = pd.qcut(x=df['column'], q=number, labels=[label], retbins=False, precision=3, duplicates=default)
-
-
查看columns的数据类型可以使用
.dtypes
方法或.info()
,查看类别文本变量名及分类可以使用.value_counts()
方法和.unique()
方法(前者可获得统计数量),nunique()
方法可获得类别数量。>>> df.dtypes ''' 输出: PassengerId int64 Survived int64df Fare float64 Cabin object Embarked object Age group category dtype: object ''' >>> df['Sex'].value_counts() ''' 输出: Sex male 453 female 261 Name: count, dtype: int64 ''' >>> df['Sex'].unique() ''' 输出: array(['male', 'female'], dtype=object) ''' >>>df['Sex'].nunique() # 输出: 2
-
将文本标签替换成数值型标签的三种方法。
-
replace
''' 参数说明: - to_replace=None/label/list...,其值是被replace的label或label list... - value=None/label/list...,其值是replace的label或label list... - inplace=Bool,如果True则替换原dataframe - regex=Bool,如果True则开启正则表达式匹配替换 ''' # 以下有具体值的为默认值 series.replace(to_replace=None, value=None, inplace=False, regex=False)
-
map
''' 参数说明: - arg为映射的字典或函数 - na_action=None/'ignore',处理NaN值时,如果是ignore则会传播NaN不对NaN映射 ''' # 以下有具体值的为默认值 series.map(func, na_action=None)
-
LabelEncoder
# 引入LabelEncoder >>> from sklearn.preprocessing import LabelEncoder # 创建encoder >>> encoder = LabelEncoder() # 向encoder中放入list,将n个类别编码为0~n-1之间的整数(包括0和n-1) >>> encoder.fit([a, b, c]) # 使用encoder (标准化) >>> answer = encoder.transform([b, c, a, a]) >>> answer # 输出:[1, 2, 0, 0]
-
-
文本数据提取用
.extract()
方法。train_data['Title'] = train_data['Name'].str.extract(' ([A-Za-z]+)\.', expand=False) ''' 参数说明: - pat='str'/'正则表达式' - flags=int ,是来自re模块的标志 - expand=Bool,True则返回每个捕获组有一列的数据框。False如果有一个捕获组,则返回序列/索引;如果有捕获组,则返回数据框。 ''' # 以下有具体值的为默认值 Series.str.extract(pat='', flags=0, expand=True)