系列文章
数据分析之pandas_20题_6-10
数据分析之pandas_20题_11-15
数据分析之pandas_20题_16-20
写在前面的话
这边笔记主要记录一些在数据分析过程中使用到的pandas模块的方法,希望可以帮到需要的人。
pandas 20题并不是简单的20个题目哟,是20中不同的需求。
pandas是什么?
pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。常用语数据分析处理
引入库
代码如下(示例):
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
1.创建DataFrame
DataFrame实质上是由多个具有相同索引的Series合并而成的,所以直接从DataFrame开始,其中涉及到的Series方法也会做说明。
1.以字典的方式创建
data = {
"name":['李梅', '林辉', '田平', '郑凤英', '杨成'],
"age":[13, 18, 15, 15, 19]
}
df = pd.DataFrame(data)
结果
2.以numpy二维数组创建
import numpy as np
data = np.random.randint(10,50,(10,5))
df = pd.DataFrame(data,columns=['A','B','C','D','E'])
结果
2. 数据集基本信息查看
当我们拿到一个数据集时需要基础信息,可以这样
df.info()
结果
可以看到这个数据及的基本信息,例如:数据集有2列,5行,非缺失值数量,每一列的类型,以及内存占用情况。
当数据集中的特征类型是数值类型时,我们往往想了解数据集的数据分布情况
df.describe()
结果
此时会获取到数据集的四分位,记录个数,平均值,标准差等等数据,方便做判断,也可以作为后续处理数据的依据
为进一步解释基本信息,需要造假数据,无需过多关注
# 导包
from faker import Faker
f = Faker('ZH-cn')
# 创建字典
data = {}
data['name'] = [f.name() for i in range(100)]
data['age'] = [f.random_int(10,60) for i in range(100)]
data['address'] = [f.address() for i in range(100)]
data['date'] = [f.date() for i in range(100)]
# 创建DataFrame
df = pd.DataFrame(data)
当有数据之后,除了通过info()方法和describe()方法查看基本信息,我们往往需要看看数据是什么样的,但是,有时候数据集往往很大,全部显示不太现实,我们可以显示几行,就像这样:
df.head(n=5) # 查看前5行
# n可以指定,默认值是5
结果
head(n)方法显示的是前n行,想要看最后n行可以用
df.tail() # 查看最后5行,默认就是5行
结果
3. 取出指定行或者列的数据
data = {
"name":['李梅', '林辉', '田平', '郑凤英', '杨成'],
"age":[13, 18, 15, 15, 19]
}
df = pd.DataFrame(data)
# 如果想取出name列的数据单独分析,就需要如下这样
df['name']
结果
取出一列,返回的结果是一个Series对象
取多列
df[['name','age']]
结果
取多行
df[1:] # 第一行以后的数据集
在工作中,筛选过滤往往没有这么简单
# 需求1 筛选年龄大于15岁的记录
df[df['age']>15]
结果
返回的结果也是DataFrame类型的
# 需求2:筛选姓李的记录
df[df['name'].str.startswith('李')]
结果
这里只是简单举例说明,其中用到的方法在后续教程中会一一讲解
前面提到的都是怎么提取一列(column)数据,有时候我们需要提取某一部分记录(row),也就是提取前n行,或者指定的行数,需要用到下述的方法。
# 需求,提取第一行记录
df.loc[1]
结果
df.iloc[1,1] # 第一行第一列的数据,因为第一行第一列对应的是一个唯一的值,所以会返回值
# 结果
18
iloc[行,列]方法
df.iloc[1:,:2] # : 代表从冒号前的值到冒号后的值的连续数值
# 这里的代码意义是: 取第一行后所有行,第二列前的所有列的数据
# 由于只有两列,最大列下标为1,所以第二列前就代表全部列
前面提到了行和列,一行就是一条记录,列可以理解为记录的属性或特征;一条记录如: name:Lily,age:15,在DataFrame中表现为如下:
pd.DataFrame({"name":["Lily"],"age":[15]})
我们可以理解为,一行数据就是一条记录,name和age是属性,DataFrame就是n个具有相同属性的记录的数据集
我们想要知道数据集的属性或者特征是就可以这样获取
df.columns
# 结果
# Index(['name', 'age'], dtype='object')
我们可以看到,特征是Index类型的,Index也是pandas的一种类型,和Series、DataFrame一样
一个数据集中有n多条记录,怎么区分呢?
数据集显示中我们可以发现,每条记录前都有数字,而我们在前面获取指定行数据时也是用到了这个数字,其实这个数字就是DataFrame的索引
想获取DataFrame的索引,可以这样做
f.index
# 结果
# RangeIndex(start=0, stop=5, step=1)
介绍完了DataFrame的索引,我们回到获取数据的话题,有时候我们的索引并不是数字(这个会在后续教程中讲解),就像我们的列(column),往往是文字描述的,我们在获取时,想通过索引名获取时,可以这样做
df.loc[1:,'name':'age']
结果
df.loc[1:,['name','age']]
结果
我们也可以重新设置索引
df.index = [i for i in 'ABCDE']
我们可以这样提取想要的数据
df.loc["A":"C",:]
结果
获取指定数据的方法很多,但是推荐选取一个值时使用df.at或者df.iat
df.iat[1,1]
# 结果 18
df.at['A','age']
# 结果 18
总之,如果是iat、iloc那么就是以索引下标取,如果是at、loc就是以索引名取
4. 缺失值处理
有时候我们拿到的数据集中记录的特征并不一定是全的,会存在缺失值
data = {
"name":['李梅', '林辉', '田平', '郑凤英', '杨成'],
"age":[13, 18, np.nan, 15, 19]
}
df = pd.DataFrame(data)
结果
可以看到我们的数据中有一个 NaN ,这是numpy中数值型缺失值
针对缺失值常用的处理方式有 删除、填充
删除
# 删除
df.dropna()
结果
dropna方法有很多参数,都是有默认值的,可以通过传不同的参数实现不同方式的删除
df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
# axis 代表要删除的是行还是列,0 代表行,就是删除一条记录
# how 代表删除的方式 any表示,记录中只要有一个是确实的,就删除整条记录,all 表示,一条记录中所有值都确实才删除
# inplace 代表该方法是否直接作用于原始的数据集,True会直接改变原有数据集,False会返回新的修改后的数据集
# subset 代表要删除那些列的缺失值
# thresh :Require that many non-NA values.
有时候,我们并不是直接进行删除,往往要看看那些值是缺失的,可以这样做
df.isna()
结果
df.notna() # 与上面的刚好相反
上面两个方法返回的是布尔值组成的DataFrame,其中True的位置代表源数据集此处的值是缺失值
有时候,不能直接对缺失值进行删除,否则会影响数据集的完整性,所以就需要填充完整
填充
- 以固定值填充
df.fillna(15)
结果
在实际工作中,不能暴力的直接填固定值,往往可以填充一些平均值或者中位数,再或者按上一条记录中的结果填充
# 以平均值填充,也可以用最大值、最小值、中位数填充
df.fillna(df.mean())
# df.median() 中位数
# df.max() 最大值
结果
- 以上一条记录或下一条记录中的值
df.fillna(method='backfill') # 用后一条记录的值填充
# backfill / bfill 用后一条记录的值填充
# pad / ffill 用上一天记录的值填充
结果
5. 异常值处理
有时候,我们拿到的数据中会出现一些异常值,例如,值超出其他数值很大,或者数据类型与其他不匹配
data = {
'name':['李梅', '林辉', '田平', '郑凤英', '杨成'],
'age':[13, 18, 130, 15, 19]
}
df = pd.DataFrame(data)
df
结果
我们一眼就可以发现,年龄(age)等于130明显不合理,这是我们就要对这些值进行删除或者替换
删除
# 删除
df.drop(index=2)
结果
替换
df.replace(130,df.age.median()) # 详细的replace方法可以查看pandas官方文档
结果
一般情况下,异常值可能会有多个,就需要利用前面学到的提取数据来得到异常数据,再对异常数据进行处理
df[df.age>100] # 获取异常值
我们也可即将异常值先赋值为缺失值(numpy.nan),然后对缺失值进行处理
df.age[df.age.values>100] = np.nan
df
结果
写在后面的话:
如果你看到了这篇文章,还请给予小小的支持,灰常感谢!!!
如果需要jupyter文件的可以私聊我哟!