简介
CSDN编辑时,图片容易缺失,可关注「懒编程」获得更好的阅读体验。
通过可视化的方式来学习Pandas中的简单操作
文中大部分图片出自A Gentle Visual Intro to Data Analysis in Python Using Pandas
Pandas是Python中知名的数据处理工具包,具有强大的功能。
Series与DataFrame
Pandas中与两种基本的数据类型,分布是Series与DataFrame
怎么理解呢?通过下面两张图就可以很好的理解Series与DataFrame之间的关系了
DataFrame中有行与列的概念,如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yz0zmAvm-1582165320572)(https://raw.githubusercontent.com/ayuLiao/images/master/20190822205107.png)]
而Series就相当于DataFrame中的一行或一列
读取数据
通过pandas的read_xxx()方法可以从对应的数据文件中读取数据,如从csv文件中读取数据,使用read_csv(),从Excel文件中读取数据,使用read_excel(),需注意,Pandas读取Excel前需要安装xlrd与xlwt。
以读入csv文件为例
import pandas as pd
df = pandas.read_csv('music.csv')
如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-epmEPgBP-1582165320574)(https://raw.githubusercontent.com/ayuLiao/images/master/20190822204338.png)]
pandas的read_xxx()方法会将数据文件中的数据读取进内存并转为DataFrame
选择数据
DataFrame作为一种类矩阵结构,支持多种筛选数据的方式,这里以下面的DataFrame为例
In [4]: df
Out[4]:
Artist Genre Listeners Plays
0 Billie Holiday Jazz 1300000 27000000
1 Jimi Hendrix Rock 2700000 70000000
2 Miles Davis Jazz 1500000 48000000
3 SIA Pop 2000000 74000000
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8atwlq7W-1582165320575)(https://raw.githubusercontent.com/ayuLiao/images/master/20190822204632.png)]
想要筛选出一列数据,可以直接通过列名去选取,选取出的数据类型为Series
In [5]: df['Artist']
Out[5]:
0 Billie Holiday
1 Jimi Hendrix
2 Miles Davis
3 SIA
Name: Artist, dtype: object
In [6]: type(df['Artist'])
Out[6]: pandas.core.series.Series
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DYkcASeV-1582165320576)(https://raw.githubusercontent.com/ayuLiao/images/master/20190822204706.png)]
想要筛选出多行数据,可以通过切片的方式去筛选
In [7]: df[1:3]
Out[7]:
Artist Genre Listeners Plays
1 Jimi Hendrix Rock 2700000 70000000
2 Miles Davis Jazz 1500000 48000000
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7GMVwTGh-1582165320585)(https://raw.githubusercontent.com/ayuLiao/images/master/20190822205242.png)]
此外也可以通过loc方法同时使用行号与列标签选择DataFrame中的任意数据片段
In [8]: df.loc[1:3, ['Artist']]
Out[8]:
Artist
1 Jimi Hendrix
2 Miles Davis
3 SIA
过滤数据
Pandas的Series与DataFrame都可以通过简单的比较运算过滤数据,可以说封装的非常好。
比如过滤出Genre(类型)为Jazz(爵士乐)的数据
In [11]: df[df['Genre'] == 'Jazz']
Out[11]:
Artist Genre Listeners Plays
0 Billie Holiday Jazz 1,300,000 27,000,000
2 Miles Davis Jazz 1,500,000 48,000,000
获取过滤出Listeners(听众)超过1800000的数据
In [19]: df[df['Listeners'] > 1800000]
Out[19]:
Artist Genre Listeners Plays
1 Jimi Hendrix Rock 2700000 70000000
3 SIA Pop 2000000 74000000
处理缺失数据
当我们对数据进行处理时,经常会遇到数据缺失的情况,如下面的DataFrame中缺失了一个数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n9ofmnS0-1582165320594)(https://raw.githubusercontent.com/ayuLiao/images/master/20190822205814.png)]
Pandas中提供了多种方法,最简单的就是使用dropna()方法将缺失数据所在的位置整行删除。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sN4G6J8f-1582165320595)(https://raw.githubusercontent.com/ayuLiao/images/master/20190822211050.png)]
此外还可以使用 fillna() 方法将的数据填充为0
分组数据
Pandas提供groupby()方法方便我们对数据进行分组处理,groupby()方法要对数据进行分组需要传入的列名,然后以该列数据为基准进行分组。
这就带了一个问题,基准列被分组其实就是对该列中的数据去重,留下不重复的数据作为不同的类别,但这就让行数变少了,那如何处理多出的数据呢?
正是因为这样的原因,直接调用groupby()方法并不能直接获取分组结果,还需要定义如何处理多出数据的逻辑,如采用sum()方法,会将基准列中相同元素对应行的其他列数据进行累加,简单使用如下:
In [20]: df.groupby('Genre').sum()
Out[20]:
Listeners Plays
Genre
Jazz 2800000 75000000
Pop 2000000 74000000
Rock 2700000 70000000
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZmMwtRtW-1582165320595)(https://raw.githubusercontent.com/ayuLiao/images/master/20190822215414.png)]
除了sum()方法外,还有mean()用于计算平均值、min()获取最小值、max()获取最大值等待。
创建新列
创建新的列对Pandas而言是非常简单的,直接为新列名赋值就好了。
In [21]: df['Avg Plays'] = df['Plays'] / df['Listeners']
In [22]: df
Out[22]:
Artist Genre Listeners Plays Avg Plays
0 Billie Holiday Jazz 1300000 27000000 20.769231
1 Jimi Hendrix Rock 2700000 70000000 25.925926
2 Miles Davis Jazz 1500000 48000000 32.000000
3 SIA Pop 2000000 74000000 37.000000
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3kN2D8FM-1582165320596)(https://raw.githubusercontent.com/ayuLiao/images/master/20190822215615.png)]
结尾
Pandas的简单使用就介绍完了,更多复杂的使用方式交个后面的文章来介绍吧,记得关注「懒编程」,拜拜。