Python+大数据-数据处理与分析(三)-数据清洗
Python+大数据-数据处理与分析(三)-数据清洗
1. 数据组合
1.1 数据聚合简介
在动手进行数据分析工作之前,需要进行数据清理工作,数据清理的主要目标是:
- 每个观测值成一行
- 每个变量成一列
- 每种观测单元构成一张表格
数据整理好之后,可能需要多张表格组合到一起才能进行某些问题的分析
- 比如:一张表保存公司名称,另一张表保存股票价格
- 单个数据集也可能会分割成多个,比如时间序列数据,每个日期可能在一个单独的文件中
1.2 concat拼接数据
基本格式:
| 方法 | 说明 |
|---|---|
pd.concat([df1, df2, ..]) |
多个数据集(DataFrame或Series)之间按行标签索引 或列标签索引拼接,默认是outer,可以设置为inner |
1.2.1 行拼接:按照列标签索引对齐
# 将 df1、df2和 df3 按照列标签对齐,进行行拼接
row_concat = pd.concat([df1, df2, df3])
row_concat

# ignore_index=True:表示 concat 拼接时忽略索引
pd.concat([df1, df2, df3], ignore_index=True)

1.2.2 列拼接:按照行标签索引对齐
# 将 df1、df2和 df3 按照行标签对齐,进行列拼接
pd.concat([df1, df2, df3], axis=1)

1.2.3 join 参数的设置
concat 方法的 join参数:
- 默认为 outter:无法对齐的行/列,默认在拼接后的数据中会填充为 NaN,因为默认拼接是 outter 拼接
- 设置为 inner:只有能够对齐的行/列,才会出现在拼接的结果中
#将 df1 和 df3 按列标签对齐,进行行拼接,设置 join='inner'
pd.concat([df1, df3], join='inner')

1.3 merge 关联数据
merge 方法类似于 sql 中的 join 语句,用于两个数据集之间按照行标签索引|列标签索引链接,默认是inner,可以设置为:left、right、outer
基本格式:
| 方法 | 说明 |
|---|---|
pd.merge(left, right, ...) 或 left.merge(right, ...) |
两个数据集直接进行关联操作 |
merge函数的参数:
- left:左侧数据集
- right:右侧数据集
- how:关联方式,默认为 inner,可以设置为:left、right、outer
- on=‘列名’: 左侧和有则数据以哪一列进行关联操作,左右两侧列名相同时才指定 on 参数
- left_on=‘左侧列名’ 和 right_on=‘右侧列名’:左右两侧关联时,列名不同时使用
- left_index=False:默认为 False,设置为 True,表示左侧的行标签和右侧的数据进行关联
- right_index=False:默认为 False,设置为 True,表示左侧的数据和右侧的行标签进行关联
1.4 join 关联数据
join 方法类是 merge 方法的一个特殊情况,被调用的数据集按照行标签索引|列标签索引和另一个数据集的行标签索引关联,默认是left,可以设置为:right,inner、outer
基本格式:
| 方法 | 说明 |
|---|---|
df.join(other, ...) |
左侧数据集的行标签或列标签和右侧数据集的行标签进行关联操作 |
join函数的参数:
- other:右侧数据集
- how:关联方式,默认为 left,可以设置为:right、inner、outer
- on=‘左侧行标签或列标签’: 左侧数据集的行标签名称或列标签名称,on省略时,默认为左侧数据行标签
- lsuffix:关联后的数据中出现相同列名时,lsuffix指定左侧数据集出现相同列名的后缀
- rsuffix:关联后的数据中出现相同列名时,rsuffix指定右侧数据集出现相同列名的后缀
2.缺失值处理
2.1 pandas 缺失值 NaN 简介
在实际进行数据处理的过程中,很多数据集都含缺失数据。
缺失数据有多重表现形式:
1)数据库中,缺失数据表示为NULL
2)在某些编程语言中用NA或None表示
3)缺失值也可能是空字符串''或数值 0
4)在 pandas 中使用 NaN 表示缺失值
- pandas 中的 NaN 值来自 NumPy 库
- NumPy 中缺失值有几种表示形式:NaN,NAN,nan,他们都一样
注意点1:缺失值和其它类型的数据不同,它毫无意义,NaN不等于0,也不等于空字符串
注意点2:两个NaN也不相等
pandas 判断是否为缺失值方法:
| 方法 | 说明 |
|---|---|
pd.isnull(obj) 或 pd.isna(obj) |
判断 obj 是否为缺失值 |
2.2缺失值处理
字段介绍:
| 字段名 | 说明 |
|---|---|
PassengerId |
乘客的ID |
Survived |
乘客是否获救,0:没获救,1:已获救 |
Pclass |
乘客船舱等级(1/2/3三个等级舱位) |
Name |
乘客姓名 |
Sex |
性别 |
Age |
年龄 |
SibSp |
乘客在船上的兄弟姐妹/配偶数量 |
Parch |
乘客在船上的父母/孩子数量 |
Ticket |
船票号 |
Fare |
船票价 |
Cabin |
客舱号码 |
Embarked |
登船的港口 |
2.3总结
- 数据中包含缺失值是很常见的情况,缺失值可能在很多环节产生(用户没填,程序错误,数据合并…)
- pandas中用np.NaN 表示缺失值,通过pd.isnull()或者pd.notnull()来判断是否是缺失值
- 常用的缺失值处理方式
- 删除缺失值
- 按行删除
- 按列删除
- 填充缺失值
- 默认值填充
- 统计值填充
- 用前、后值填充
- 线性插值填充
- 删除缺失值
3. 数据整理
3.1 melt整理数据
3.1.1 宽数据集变为长数据集
# 加载数据
#加载美国收入与宗教信仰数据 pew.csv
pew = pd.read_csv('./data/pew.csv')
pew.head()
pew_long = pd.melt(pew, id_vars=['religion'])
pew_long

结果说明:
1)我们发现,基于religion列,把原来的df拉长了,我们称原来的df为宽数据集,拉长之后的df称之为长数据集
- 对于展示数据而言,下图中
pew返回的这种"宽"数据没有任何问题,如第一行数据,展示了Agnostic(不可知论(者))所有的收入分布情况 - 从数据分析的角度,有时候我们需要把数据由"宽"数据,转换成"长"数据,就如同下图中
pew_long返回的数据 - 在pandas中我们就可以使用
df.melt()函数,通过各种参数,来达成宽数据集转换为长数据集的效果
3.1.2 melt 函数的参数
melt 是溶解/分解的意思, 即拆分数据;melt即是类函数也是实例函数,也就是说既可以用pd.melt(), 也可使用dataframe.melt()
| 参数 | 类型 | 说明 |
|---|---|---|
| frame | dataframe | 必要参数,被 melt 的数据集名称在 pd.melt() 中使用,比如上例中pd.melt(pew, id_vars='religion')的pew |
| id_vars | tuple/list/ndarray | 可选项,不需要被转换的列名,在转换后作为标识符列(不是索引列),比如上例pd.melt(pew, id_vars='religion') |
| value_vars | tuple/list/ndarray | 可选项,需要被转换的现有列,如果未指明value_vars,除id_vars指定的其他列都将被转换 |
| var_name | string | 自定义设置variable列的列名 |
| value_name | string | 自定义设置value列的列名 |
3.2stack 整理数据
pandas进行数据重排时,经常用到 stack 和 unstack 两个函数。stack 的意思是堆叠、堆积,unstack 即"不要堆叠"
常见的数据的层次化结构有两种,一种是表格,一种是"花括号",即下面这样的两种形式:

stack函数会将数据从表格结构 变成 花括号结构(返回的是series类型),即将其列索引变成行索引,反之,unstack函数将数据从 花括号结构变成 表格结构,即要将其中一层的行索引变成列索引。
3.3wide_to_long 整理数据
wide_to_long函数的作用是将列名起始部分相同的列进行拆解,使宽数据变换为长数据
需求:
- 加载
data/movie.csv数据,统计每部电影的每个主演的被点赞数,返回新的df - 新df 的列名为
movie_title、actor_num、actor、actor_facebook_likes:分别代表电影名称、演员编号、演员姓名、该演员被点赞数
3.4 总结
- melt、stack、wide_to_long函数均可以实现将宽数据整理成长数据
- melt:指定数据列,将指定列变成长数据
- stack:返回一个具有多层级索引的数据,配合reset_index可以实现宽数据变成长数据
- wide_to_long:处理列名带数字后缀的宽数据
- stack/unstack, melt/pivot_table 互为逆向操作
4. pandas数据类型
4.1 pandas 数据类型简介
4.1.1 Numpy介绍
Numpy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组。
1)Numpy 支持常见的数组和矩阵操作
- 对于同样的数值计算任务,使用 Numpy 比直接使用 Python 要简洁的多
2)Numpy 使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器
比如我们现在对下面表格中的数据用 Numpy 的 ndarray 类型来存储:

Numpy ndarray的优势:
1)数据在内存中存储的风格
- ndarray 在存储数据时所有元素的类型都是相同的,数据内存地址是连续的,批量操作数组元素时速度更快
- python 原生 list 只能通过寻址方式找到下一个元素,这虽然也导致了在通用性方面 Numpy 的 ndarray 不及python 原生 list,但计算的时候速度就慢了
4.1.2 Numpy 的 ndarray
ndarray的属性清单:
| 属性 | 说明 |
|---|---|
| ndarray.shape | 数组维度的元组 |
| ndarray.ndim | 数组维数 |
| ndarray.size | 数组中的元素数量 |
| ndarray.itemsize | 一个数组元素的长度(字节) |
| ndarray.dtype | 数组元素的类型 |
- 下表为ndarray的全部数据类型;最常用的类型是布尔和int64,其他只要了解就好:
| 名称 | 描述 | 简写 |
|---|---|---|
| np.bool | 用一个字节存储的布尔类型(True或False) | ‘b’ |
| np.int8 | 一个字节大小,-128 至 127 | ‘i’ |
| np.int16 | 整数,-32768 至 32767 | ‘i2’ |
| np.int32 | 整数,-2的31次方 至 2的32次方 -1 | ‘i4’ |
| np.int64 | 整数,-2的63次方 至 2的63次方 - 1 | ‘i8’ |
| np.uint8 | 无符号整数,0 至 255 | ‘u’ |
| np.uint16 | 无符号整数,0 至 65535 | ‘u2’ |
| np.uint32 | 无符号整数,0 至 2的32次方 - 1 | ‘u4’ |
| np.uint64 | 无符号整数,0 至 2的64次方 - 1 | ‘u8’ |
| np.float16 | 半精度浮点数:16位,正负号1位,指数5位,精度10位 | ‘f2’ |
| np.float32 | 单精度浮点数:32位,正负号1位,指数8位,精度23位 | ‘f4’ |
| np.float64 | 双精度浮点数:64位,正负号1位,指数11位,精度52位 | ‘f8’ |
| np.complex64 | 复数,分别用两个32位浮点数表示实部和虚部 | ‘c8’ |
| np.complex128 | 复数,分别用两个64位浮点数表示实部和虚部 | ‘c16’ |
| np.object_ | python对象 | ‘O’ |
| np.string_ | 字符串 | ‘S’ |
| np.unicode_ | unicode类型 |
4.1.3 pandas 的数据类型
pandas 是基于 Numpy 的,很多功能都依赖于 Numpy 的 ndarray 实现的,pandas 的数据类型很多与 Numpy 类似,属性也有很多类似。比如 pandas 数据中的 NaN 就是 numpy.nan
下图中为 pandas 的数据类型清单,其中 category 我们之前的学习中没有见过的:
- category 是由固定的且有限数量的变量组成的。比如:性别、社会阶层、血型、国籍、观察时段、赞美程度等等。
- category 类型的数据可以具有特定的顺序。比如:性别分为男、女,血型ABO。我们会在本章节的最后来了解这种数据类型。

4.2 类型转换
4.2.1 astype函数
astype方法是通用函数,可用于把DataFrame中的任何列转换为其他dtype
可以向astype方法提供任何内置类型或numpy类型来转换列的数据类型
4.2.2 转换为字符串对象
在上面的tips数据中,sex、smoker、day 和 time 变量都是category类型。通常,如果变量不是数值类型,应先将其转换成字符串类型以便后续处理
有些数据集中可能含有id列,id的值虽然是数字,但对id进行计算(求和,求平均等)没有任何意义,在某些情况下,可能需要把它们转换为字符串对象类型。
1)把一列的数据类型转换为字符串,可以使用 astype方法:
tips['sex_str'] = tips['sex'].astype(str)
print(tips.dtypes)

4.3 总结
- Numpy 的特点
- Numpy 是一个高效科学计算库,pandas 的数据计算功能是对 Numpy 的封装
- ndarray 是 Numpy 的基本数据结构,pandas 的 Series 和 DataFrame 好多函数和属性都与 ndarray 一样
- Numpy 的计算效率比原生 Python 效率高很多,并且支持并行计算
- pandas 数据类型转换
- pandas 除了数值型的 int 和 float 类型外,还有object、category、bool、datetime类型
- 可以通过 as_type 和 to_numeric 函数进行数据类型转换
- pandas 分类数据类型
- category 类型,可以用来进行排序,并且可以自定义排序顺序
- CategoricalDtype 可以用来定义顺序
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)