Python数据清洗——Pandas
Posted 土味儿大谢
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python数据清洗——Pandas相关的知识,希望对你有一定的参考价值。
文章目录
- 一、Series的定义和使用
- 二、DataFrame数据结构与行列操作
- 三、DataFrame 描述统计、离散化、排序
- 四、缺失值、重复值、异常值的处理
- 五、聚合、分组与透视表
- 六、向量化字符串操作
- 七、练习
一、Series的定义和使用
- Series 是一个带有名称和索引的一维数组。
- Series 中包含的数据类型可以是整数、浮点、字符串、列表、元组、ndarray等。
pd.Series([‘data=None’, ‘index=None’, ‘dtype=None’, ‘name=None’])
# 导入相关库(一般一起导入两个包)
import numpy as np
import pandas as pd
Series中只能保存一种数据类型,如果不一致会自动转化为一致,与ndarray类似
1.1 Series索引标签的添加
1.1.1 创建Series对象时添加
1.1.2 建立好Series后用一个新的列表赋值到该Series的索引对象index中
1.2 Series的名字
1.2.1 创建Series对象的时候添加
1.2.2 建立好Series后通过改变Series实例属性的方式添加
1.2.3 Series索引名字的添加
1.3 Pandas的Index对象
1.4 Series的索引和切片
1.4.1 数字下标去取
1.4.2 标签名去取
1.5 Series的.get()方法
1.6 Series掩码提取
补充:ufunc可以在在Series对象中使用
二、DataFrame数据结构与行列操作
2.1 DataFrame的创建
2.1.1 通过数组转化
2.1.2 通过字典转化
2.1.3 通过嵌套列表转化
嵌套列表换成ndarray也可以
DataFrame有行标签以及列标签,在设置的时候可以在创建DataFrame的时候赋值给相应的参数,也可以通过对对应的属性进行赋值,从而添加或者修改
2.2 数据提取
2.2.1 根据列标签名提取
2.2.2 df.loc[]
语法 user_info.loc[索引行,索引列 ]
2.2.3 df.iloc[]
2.3 行列增删改
2.3.1 行的增加与修改
2.3.2 列的增加与修改
以下表为例子,在指定位置新增一列指定科目的相加的总分
df.insert
新增一列 理综 位置在生物后面
新增一列 排名, 位置在总分之前,名次从1开始
2.3.3 行列删除
2.3.3.1 df.drop()
df.drop()操作,设置inplace=False并没有删除原表记录,而是返回了一个新的DataFrame对象。
删除 排名
2.3.3.2 df.pop()
df.pop()方法只能删除列。
df.pop()会直接删除原表的列!谨慎操作!
2.4 列顺序的更改
df.pop()+df.insert()
- 将要移动位置的列使用df.pop()删除,并使用变量进行接收
- 使用df.insert()把弹出来的这一列放到原df你想放的位置
- 使用df.insert()插入列,会直接改变原df
2.5 索引和列名的修改
- 修改索引名用需要在df.rename()中设置index参数。
- 修改列名只需要设置参数 columns。
使用df.rename()将整个索引标签替换掉,包括行标签index,列标签columns,只需要建立一个字典:
- 该字典的“键”对应着“旧索引”
- 该字典的“值”对应着“新索引”
df.rename()也可以通过字典映射的方法,修改DataFrame的列表标签:
修改索引df.index
2.6 单列数据类型转换
2.6.1 Series.astype
2.7 表合并方式
2.7.1 pd.concat([表1,表2])
两个表↓
2.7.2 df.append(df)
2.7.3 pd.merge()
有内连接、左连接、右连接操作。和mysql里面的原理一致
两张表↓
2.7.3.1 内连接
就普通的把俩表都有的数据相匹配查询出来,可以说为普通查询
2.7.3.2 左连接
简单理解为以左表内容为主,进行查询,左表有,右表没有的内容会被以NaN填满
2.7.3.3 右连接
简单理解为以右表内容为主,进行查询,右表有,左表没有的内容会被以NaN填满
2.8 数据保存与读取
2.8.1 保存
2.8.2 读取
三、DataFrame 描述统计、离散化、排序
3.1 查看基本信息
3.1.1 df.info()
3.1.2 df.head(num)
3.1.3 df.shape
3.1.4 df.T
通过 .T 获取数据的转置
3.1.5 df.values
获取原有数据
3.2 描述与统计
指标 | 描述 |
---|---|
count() | 计数项 |
mean()、median() | 均值与中位数 |
min()、max() | 最大值与最小值 |
mode() | 众数 |
std()、var() | 标准差与方差 |
prod() | 所有项乘积 |
sum() | 所有项求和 |
- 计算数学成绩的平均值,以及数学成绩的标准差。
- 生成第二个总分列,计算语文+数学成绩的总分,命名为‘总分2’。
- 计算每个同学的‘数学减去语文’的成绩,取绝对值,命名为‘文理偏科值’。
3.2.1 df.describe()
3.2.2 Series.value_counts()
如果想要统计某个字段不同数值出现的频次,我们可以使用.value_counts()方法
3.3 离散化
3.3.1 pd.cut()
有时候,我们会碰到这样的需求,想要将年龄进行离散化(分箱),直白来说就是将年龄分成几个区间,这里我们想要将年龄分成 3 个区间段。就可以使用 pd.cut 方法来完成,返回的也是Series。
有时候离散化之后,想要给每个区间起个名字,可以在pd.cut()中使用参数 labels 来指定。
3.3.2 pd.qcut()
除了可以使用 cut 进行离散化之外,qcut 也可以实现离散化。cut 是根据每个值的大小来进行离散化的,qcut 是根据每个值出现的次数来进行离散化,也就是基于分位数的离散化功能。
3.4 排序功能
3.4.1 df.sort_index()
sort_index 方法默认是按照索引进行正序排的。
3.4.2 df.sort_values()
按照实际值来排序
按照总分进行降序排序
3.4.3 Series.nlargest()
一般在排序后,我们可能需要获取最大的n个值或最小值的n个值,我们可以使用 nlargest 和 nsmallest 方法来完成,这比先排序再使用 head(n)方法快得多。
3.5 函数应用及映射方法
3.5.1 Series.map()
map 是 Series 中特有的方法,通过它可以对 Series 中的每个元素实现转换。
3.5.2 Series.apply()和df.apply()
apply 方法既支持 Series,也支持 DataFrame,在对 Series 操作时会作用到每个值上,在对 DataFrame 操作时会作用到所有行或所有列(通过 axis参数控制)。
Series.apply()只是将上一小节中的Series.map()换成了.apply(),其余代码一样
对 DataFrame 来说,apply 方法的作用对象是一行或一列数据(一个Series)
- axis为 0或’index’:将函数应用于每列。
- axis为1或’columns’:将函数应用于每一行。
3.5.3 df.applymap()
applymap 方法针对于 DataFrame,它作用于 DataFrame 中的每个元素,它对 DataFrame 的效果类似于 apply 对 Series 的效果
还是操作heros那张表
若有一张表
orders = pd.read_csv('/data/orders.csv')
orders.head(2)
#显示的最大行数和列数为100,如果超过设置的行和列就显示省略号
pd.set_option('display.max_rows', 100)
pd.set_option('display.max_columns', 100)
提取买家应付货款, 买家应付邮费, 总金额, 买家实际支付金额四列,计算这四列每列的总计和
money_part = orders[['买家应付货款', '买家应付邮费', '总金额', '买家实际支付金额']]
money_part
money_part.apply(np.sum,axis=0)
四、缺失值、重复值、异常值的处理
4.1 缺失值的处理
4.1.1 发现缺失值
4.1.1.1 df.isnull()
4.1.1.2 df.notnull()
和isnull()对立,是查不为空的数据,用法和isnull()一样,就不多说了。这个方法用的不是很多
4.1.2 剔除缺失值df.dropna()
还是这个表
4.1.2.1 参数how
how="all"只有当该列(或行)全都为缺失值时,才会将该列删除
how="any"只有当该列(或行)有一个缺失值,就会将该列删除 默认
4.1.2.2 参数thresh
thresh参数设置的是:你想至少留下多少非缺失值!
如何删除heros_null中缺失值超过45%的字段。
- 非缺失值的数量不能低于55%
- 整个字段元素的个数 (行数)
- 非缺失值的数量不低于 整个字段元素的个数*0.55
4.1.3 填充缺失值
4.1.3.1 固定值填充fillna()
填充均值容易受到异常值的影响,所以可以使用:
- 中位数:Series.median()
- 众数:Series.mode() 但并不是所有数据集都有众数,如[1,2,3,4,5]
4.1.3.2 从前往后填充method
4.1.3.3 从后往前填充
与之相反
4.1.3.4 df.replace()
有的缺失值并非是NaN,所以我们应该用replace()去把这些缺失值替换成NaN,然后再进行相应缺失值的操作
4.2 重复值的处理drop_duplicates()
pandas 里面 drop_duplicates函数用于删除Series、DataFrame中重复记录,并返回删除重复后的结果。
补充:nunique()返回非重复值统计的个数
4.3 异常值的处理(仅了解)
检测到了异常值,我们需要对其进行一定的处理。而一般异常值的处理方法可大致分为以下几种:
- 删除含有异常值的记录:直接将含有异常值的记录删除;
- 视为缺失值:将异常值视为缺失值,利用缺失值处理的方法进行处理;
- 平均值修正:可用前后两个观测值的平均值修正该异常值;
- 不处理:如果异常值具有实际价值,直接在具有异常值的数据集上进行数据挖掘;
五、聚合、分组与透视表
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# 解决坐标轴刻度负号乱码
plt.rcParams['axes.unicode_minus'] = False
# 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['Simhei']
#plt.rcParams["font.family"] = 'Heiti TC' #mac字体不显示
常用聚合函数如下
指标 | 描述 |
---|---|
count() | 计数项 |
mean()、median() | 均值与中位数 |
min()、max() | 最大值与最小值 |
std()、var() | 标准差与方差 |
prod() | 所有项乘积 |
sum() | 所有项求和 |
5.1 groupby分组
操作实现原理如图所示
groupby对象可迭代
5.1.1 依据多个键分组(仅了解)
5.2 多级索引对象(仅了解)
5.2.1通过Series自带的索引值
5.2.2 通过一级索引标签
5.2.3 通过二级或以上索引标签
5.2.4 多级索引的DataFrame
5.3 索引的重置与设置(重要!)
5.3.1 .reset_index()方法
如果想保留索引“船舱等级”,只是把索引“性别”变成单独的一列字段呢?
可以在.reset_index()方法中用参数level指定要转化成字段的索引名:
drop=True #把原本的索引删掉,重新排列
5.3.2 .set_index()方法
- sort_index() 对数字索引进行排序(不会重置,不会改变原来数字索引的大小)
- reset_index() 把标签列转为数据列
- set_index() 指定数据列设置为标签列
5.4 索引的.stack()与.unstack()
如果我们有上面这样的两级索引的DataFrame对象(或Series对象),这时我们如果想要将把行索引“性别”,挪到列索引中,可以用unstack()方法,同样也是使用参数level指定索引“性别”即可:
这样,我们就可以直观地看出一等舱中没有男性。
要是把上面的表“复原”呢?同理使用.stack()方法就可以。
5.5 分组后累积、过滤、转换、应用
5.5.1 分组后合计aggregate()
5.5.2 分组后过滤filter()
5.5.3 分组后转换transform()
5.5.4 分组后应用apply() (重点!)
5.6 透视表(拓展)
5.6.1 pd.pivot_table()
pd.pivot_table(values=None, index=None, columns=None, aggfunc=‘mean’,
fill_value=None, margins=False, dropna=True, margins_name=‘All’)
- values:要聚合的列,可选
- index:在数据透视表索引上分组的键。
- columns:在数据透视表列上分组的键。
- aggfunc:function,function of list,dict,default numpy.mean
- 如果传递的函数列表,则生成的数据透视表将具有分层列。
- 如果传递了dict,则键是要聚合的列,值是函数或函数列表。
- fill_value:标量,默认无,用于替换缺失值的值。
- margin:boolean,默认为False,添加所有行/列(例如,对于小计/总计)。
- dropna:布尔值,默认为True,不包括条目全部为NaN的列
- margins_name:string,默认为’All’,当边距为真时,将包含总计的行/列的名称。
5.6.1.1 参数aggfunc
如果我们多维分析"幸存否"的不是均值,而是总人数,这时候就需要用aggfunc参数指定聚合函数:
如果我们想求幸存者的总人数,也想求幸存者的平均年龄:
5.6.1.2 参数margins
5.6.2 多级透视表
六、向量化字符串操作
6.1 Pandas字符串操作
Python数据清洗——Pandas