python数据分析————数据清洗
数据清洗处理缺失值处理重复值处理异常值更改数据类型数据转换更改数据类型离散化和分箱虚拟变量数据合并主键合并数据索引合并轴向堆叠数据联合重叠数据数据重塑层次化索引重塑层次化索引轴向旋转...
·
p a n d a s 库 是 p y t h o n 中 用 于 数 据 处 理 很 流 行 的 类 库 \color{red}{pandas库是python中用于数据处理很流行的类库} pandas库是python中用于数据处理很流行的类库,有不太了解的可以看我前几篇博客pandas的基本功能和pandas库的数据结构Series和DataFrame的基本使用
- 基本运行环境
import pandas as pd
import numpy as np
数据清洗
- 数据清洗的结果是对各种脏数据进行对应方式的处理,得到标准的、干净的、连续的数据,提供给数据统计、数据挖掘等使用。数据清洗是一项复杂且繁琐的工作,是一个分析项目中最占时间且最重要的步骤。
- 数据清洗主要包括删除重复值、统一规格、修正逻辑、数据压缩、补足缺失/空值、丢弃异常值等,它的目的在于提高数据的质量问题即解决数据的完整性、唯一性、权威性、合法性和一致性
处理缺失值
- Series
s1 = pd.Series([1,np.nan,3,None,5])
# 输出结果
0 1.0
1 NaN
2 3.0
3 NaN
4 5.0
dtype: float64
检测
# isna/isnull/notnull/notna:判断是否为缺失值
print(pd.isna(s1))
print(pd.isnull(s1))
0 False
1 True
2 False
3 True
4 False
dtype: bool
过滤
# dropna方法:Series对象直接删除空值NA
print(s1.dropna())
0 1.0
2 3.0
4 5.0
dtype: float64
填充
# fillna方法:空值填充
print(s1.fillna(99))
0 1.0
1 99.0
2 3.0
3 99.0
4 5.0
dtype: float64
- DataFrame
dframe = pd.DataFrame([[1, 6, 3.], [2., np.nan,np.nan],[None, np.nan, pd.NA], [pd.NaT, 7, 4.]],columns=['A','B','C'])
A B C
0 1 6.0 3.0
1 2.0 NaN NaN
2 None NaN <NA>
3 NaT 7.0 4.0
检测
# isna/isnull/notnull/notna:判断是否为缺失值
print(pd.notna(dframe))
print(pd.notnull(dframe))
A B C
0 True True True
1 True False False
2 False False False
3 False True True
过滤
pd.DataFrame.dropna的参数 | 说明 |
---|---|
axis=0 | 删除NA所在的行,默认 |
axis=1 | 删除NA所在的列 |
how=‘any’ | 只要有一个NA就删除,默认 |
how=‘all’ | 整行/列都为NA才删除 |
thresh=3 | 整行/列至少有3个非NA数据(有效数据),否则就删除 |
inplace= | 是否在原数据上操作,默认False,即返回新的对象 |
# dropna方法:DataFrame对象默认删除NA所在的行
print(dframe.dropna())
print(dframe.dropna(axis=1))
print(dframe.dropna(thresh=2))
填充
# 使用指定数据填充
print(dframe.fillna(10))
print(dframe.fillna(value=10))
print(dframe.fillna({'A': 12, 'C': 21}))
# 使用已有数据填充
print(dframe.fillna(method='ffill'))
A B C
0 1.0 6.0 3.0
1 2.0 6.0 3.0
2 2.0 6.0 3.0
3 2.0 7.0 4.0
print(dframe.fillna(method='bfill'))
A B C
0 1 6.0 3.0
1 2.0 7.0 4.0
2 NaT 7.0 4.0
3 NaT 7.0 4.0
- 关于ffill和bfill填充问题
ffill前向填充;bfill后向填充。有趣的是,如果有插入索引的问题,在索引填充时前向填充ffill会选取最后一个索引来进行填充;同理,后向填充bfill会选取最后一个索引后的值来进行填充,索引此时填充的即为NaN空值
处理重复值
重复值的定义:
- 在Series中指相同的数据
- 在DataFrame中指完全相同的两行。
- 检测重复值
s2 = pd.Series([1,1,2,4,5])
print(s2.duplicated(keep='first'))
print(s2.duplicated(keep='last'))
print(s2.duplicated(keep=False))
dframe = pd.DataFrame([[1, 6, 3.], [3, 6, 9],[1, 6, 3.], [5, 7, 4.]],columns=['A','B','C'])
print(dframe.duplicated(keep='first'))
print(dframe.duplicated(keep='last'))
print(dframe.duplicated(keep=False))
duplicated方法的参数 | 说明 |
---|---|
keep=’first’ | 第一个除外,将重复项标记为True |
keep=’last’ | 最后一个除外,将重复项标记为True |
keep=False | 将所有重复项标记为True |
- 删除重复值
s2 = pd.Series([1,1,2,4,5])
s2.drop_duplicates()
dframe = pd.DataFrame([[1, 6, 3.], [1, 6, 9],[1, 6, 3.], [5, 7, 4.]],columns=['A','B','C'])
print(dframe.drop_duplicates())
# 删除'B'索引列的重复项
print(dframe.drop_duplicates(['B']))
drop_duplicates方法的参数 | 说明 |
---|---|
keep=’first’ | 删除除第一次出现之外的重复项 |
keep=’last’ | 删除除最后一次出现之外的重复项 |
keep=False | 删除所有重复项 |
处理异常值
dframe = pd.DataFrame([[1, 6, 999], [2., np.nan,np.nan],[None, np.nan, pd.NA], [pd.NaT, 7, 4.]],columns=['A','B','C'])
# 用10替换异常值和空值
print(dframe.replace([999,None,np.nan,pd.NaT,pd.NA],10))
A B C
0 1 6.0 10
1 2 10.0 10
2 10 10.0 10
3 10 7.0 4
更改数据类型
dframe = pd.DataFrame({'A': [1, 1.2, 4.2],
'B': [-9, '7', 8.8],
'C': ['x', 5.0, 0]})
print(dframe.dtypes)
A float64
B object
C object
dtype: object
# 转换数据类型
print(dframe['B'].astype(dtype='int'))
0 -9
1 7
2 8
Name: B, dtype: int32
# 将参数类型转换为数字类型(支持标量、列表、元组、一维数组、Series;不支持DataFrame)
print(pd.to_numeric(dframe['B']))
print(pd.to_numeric(dframe['C'], errors='coerce'))
errors参数 | 说明 |
---|---|
errors=‘raise’ | 无效解析会引发异常,默认 |
errors=‘coerce’ | 无效解析设置为NaN |
errors=‘ignore’ | 将无效解析返回输入,不转换 |
更多推荐
所有评论(0)