Datawhale动手数据分析第二章第一节
学习资料:https://github.com/datawhalechina/hands-on-data-analysis
本文列举了简单的数据清洗方法,包含以下几部分:
- 缺失值,重复值,异常值观察和处理
- 连续变量分桶
- 离散变量编码
数据清洗
缺失值
- 缺失值观察
df.info()
:查看数据框中每列的数据类型和非空值的数量。df.isnull().sum()
:计算每列的缺失值数量。
对缺失值进行处理
- 直接删除:缺失值的行或列不多,可以直接删除包含缺失值的行或列。
dropna
方法用于删除包含缺失值的行或列。参数:
*axis
:0 或 1,默认为 0。0 表示行,1 表示列。
*how
:’all’ 或 ‘any’,默认为 ‘any’。’all’ 表示只有当行或列的所有值都是 NaN 时才删除,’any’ 表示只要行或列中有一个值是 NaN 就删除。
*thresh
:int,可选。指定需要保留的非 NA/null 值的最小数量。
*subset
:列标签的列表,可选。表示要考虑其 NaN 值的列的子集。
*inplace
:bool,默认为 False。如果为 True,则修改原始 DataFrame。否则,返回一个新的 DataFrame。
1
2
3
4
5# 删除包含缺失值的行
df_dropped = df.dropna()
# 删除包含缺失值的列
df_dropped = df.dropna(axis=1)- 填充:可以使用均值、中位数、众数等统计量来填充缺失值。或者用0填充标记缺失值。
fillna
方法用于填充缺失值。参数:
*value
:用于填充缺失值的值。可以是标量、字典或 Series。如果指定了一个字典,那么字典的键应该是列名,值应该是用于填充该列缺失值的值。如果指定了一个 Series,那么它的索引应该是列名。
*method
:{‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None},默认为 None。指定用于填充缺失值的方法。’backfill’ 或 ‘bfill’ 表示使用下一个非缺失值进行填充,’pad’ 或 ‘ffill’ 表示使用前一个非缺失值进行填充。
*axis
:0 或 1,默认为 0。指定填充的轴。0 表示行,1 表示列。但请注意,当使用 method 参数时,axis 只能为 0 或 None。
*inplace
:bool,默认为 False。如果为 True,则修改原始 DataFrame。否则,返回一个新的 DataFrame。
*limit
:int,可选。指定在前向或后向填充时的最大填充数量。
1
2
3
4
5# 使用均值填充数值型列的缺失值
df['column1'].fillna(df['column1'].mean(), inplace=True)
# 使用众数填充分类型列的缺失值
df['column2'].fillna(df['column2'].mode()[0], inplace=True)- 直接删除:缺失值的行或列不多,可以直接删除包含缺失值的行或列。
重复值
- 观察重复值
df.duplicated()
返回一个布尔型Series,其中的每个值都表示相应行是否是前面出现过的重复行。
df.duplicated().sum()
可以计算重复行的数量。
1 | duplicate_rows = df.duplicated().sum() |
- 对重复值进行处理
删除重复的行来保持数据的唯一性。
1 | df.drop_duplicates(keep='first', inplace=True) |
异常值
- 识别异常值
可以使用描述性统计(如IQR)或可视化方法(如箱线图)来识别异常值。
1 | # 使用IQR方法识别异常值 |
- 对异常值进行处理
处理异常值的方法取决于数据的性质和业务需求。常见的处理方法包括删除、替换为特定值(如NaN、中位数等)或使用其他方法进行转换。
数据编码
连续变量分桶
pd.cut()
或 pd.qcut()
函数将连续变量划分为几个桶(区间)。
pd.cut()
用于将连续数字变量分割成指定数量的等宽区间。参数:
-x
:需要处理的数据。
-bins
:指定区间边界或区间的数量。可以是一个整数,表示区间的数量;也可以是一个列表或数组,表示区间的边界值。
-labels
:用于指定每个区间的标签,可以是一个列表或数组。如果未指定,则使用整数作为标签。
1 | # 将数据分割成3个等宽区间 |
pd.qcut()
用于将连续数字变量分割成指定数量的等频区间。参数:
-x
:需要处理的数据。
-q
:指定区间的数量或一个表示分位数的列表。可以是一个整数,表示区间的数量;也可以是一个列表或数组,表示具体的分位数。
-labels
:用于指定每个区间的标签,可以是一个列表或数组。如果未指定,则使用整数作为标签。
1 | # 将数据分割成3个等频区间 |
对文本(分类)变量进行编码
- 查看文本变量及种类
三种方法:
value_counts()
方法用于计算 Series 对象中每个唯一值出现的次数,按出现次数降序排列返回一个 Series 对象unique()
方法用于返回 Series 对象的唯一值组成的 ndarray 对象。nunique()
方法用于返回 Series 或 DataFrame 列中唯一值的数量。
- 对于文本或分类变量,可以使用标签编码(Label Encoding)或独热编码(One-Hot Encoding)进行转换。
- 标签编码:将每个类别标签替换为一个整数。
1 | from sklearn.preprocessing import LabelEncoder |
- 独热编码:为每个类别创建一个新的二进制列。
1 | df_encoded = pd.get_dummies(df, columns=['column2']) # 假设 'column2' 是分类变量 |