Pandas
是一个开源的,BSD许可的库,为Python编程言语提供高性能,易于运用的数据结构和数据剖析工具。和Numpy,Matplotlib合称Python数据剖析三剑客。
开端学习数据剖析的时分,一直对为什么运用Pandas有疑问。Numpy已经满足强壮,Matplotlib专注于数据可视化,那么Pandas是用来干什么的呢?官方是这样说:
- Python在数据处理和预备方面一直做得很好,但在数据剖析和建模方面就没那么好了。Pandas协助填补了这一空白,使您能够在Python中履行整个数据剖析作业流程
- 与出色的 IPython 工具包和其他库相结合,Python中用于进行数据剖析的环境在性能、生产率和协作能力方面都是卓越的
总结的很好,我想这对初学者心中的疑问并没有缓解多少。下面我测验运用我的了解来答复这个问题,这不需求太多基础,咱们能够定心食用。
Pandas支撑文本索引
小恩同学某学期的成果如下表:
数学 | 语文 | 英语 |
---|---|---|
98 | 86 | 90 |
成果在python中能够运用数组表明一维数据:
scores=[98,86,90]
假如咱们想知道小恩同学的语文成果:
print(scores[1])
序号0,1,2别离表明数学,语文和英语的成果。序号从0开端是python的规范。
假如咱们想知道小恩同学的三科最高分和平均分呢?这需求一些数据处理,运用python完成很简单:
>>> max(scores)
98
>>> sum(scores)/len(scores)
91.33333333333333
可是运用numpy更简单:
>>> import numpy as np
>>> scores=np.array([98,86,90])
>>> scores.max()
98
>>> scores.mean()
91.33333333333333
>>> scores[0]
98
不知道咱们有没有感受到这样界说一维数据有一个小小的可是又很有负担的问题。数据的标签丢掉了,只能够运用序号0,1,2去取值。取完值后,还需求自己去检查数值序号对应的列标签。
pandas的Series是用来表明一维数据结构,很好的解决了这个问题:
>>> import pandas as pd
>>> s = pd.Series([98,86,90], index=["math","chn","eng"])
>>> s
math 98
chn 86
eng 90
dtype: int64
>>> s[1]
86
>>> s.chn
86
>>> s["chn"]
86
咱们能够看到pandas中能够运用s.chn
或许s["chn"]
这样的文本索引取值,更明晰明了。
同时pandas中也集成了一些常用计算办法,直接检查数据概略:
>>> s.describe()
count 3.000000
mean 91.333333
std 6.110101
min 86.000000
25% 88.000000
50% 90.000000
75% 94.000000
max 98.000000
咱们将小西同学的期末成果也汇入到成果表中:
名字 | 数学 | 语文 | 英语 |
---|---|---|---|
小恩 | 98 | 86 | 90 |
小西 | 96 | 92 | 93 |
这样成果表就变成了二维数据了,在pandas中就需求运用另外一种数据结构DataFrame来界说:
>>> df = pd.DataFrame([[98,86,90],[96,92,93]], columns=["math","chn","eng"], index=["xiaoen","xiaoxi"])
>>> df
math chn eng
xiaoen 98 86 90
xiaoxi 96 92 93
咱们运用数据,列名和行名(索引)界说了一个DataFrame对象,它和上面的成果表共同。需求额定留意一下的是,为了让表格展现共同,这里将列标签界说为[“math”,”chn”,”eng”],索引标签界说为名字[“xiaoen”,”xiaoxi”]。
当然行和列仅仅展现数据的一种视觉角度,在pandas中能够无缝快速转化:
>>> df.T
xiaoen xiaoxi
math 98 96
chn 86 92
eng 90 93
>>> df.T.index
Index(['math', 'chn', 'eng'], dtype='object')
>>> df.T.columns
Index(['xiaoen', 'xiaoxi'], dtype='object')
在二维数据中,查找数据咱们一般先找到对应的行,或许对应的列:
# 查找行
>>> df.loc["xiaoen"]
math 98
chn 86
eng 90
Name: xiaoen, dtype: int64
# 查找列
>>> df["chn"]
xiaoen 86
xiaoxi 92
Name: chn, dtype: int64
找到行/列后会得到一个Series数据对象,这样再查找对应行中的列/列中的行和前面Series语法共同。同样是查找小恩同学的语文成果:
# 先行后列
>>> df.loc["xiaoen"]["chn"]
86
# 先列后行
>>> df["chn"]["xiaoen"]
86
当然最简单的运用数字索引方式查找也是能够的:
>>> df.iloc[0][1]
86
- loc和iloc是不是不简单分清,把它了解成index of location就好了
咱们能够看的不管数据是一维还是二维,Pandas都支撑文本索引,这样运用起来会更方便。
Pandas数据格式化更直观
pandas中数据格式化做了优化,看起来更直观明晰。
在numpy中上面的成果表,它看起来是这样的:
>>> scores=np.array([[98,86,90],[96,92,93]])
>>> scores
array([[98, 86, 90],
[96, 92, 93]])
可是在pandas中,它看起来是这样的:
>>> df = pd.DataFrame([[98,86,90],[96,92,93]], columns=["math","chn","eng"], index=["xiaoen","xiaoxi"])
>>> df
math chn eng
xiaoen 98 86 90
xiaoxi 96 92 93
数据展现的时分通过格式化,对齐的更整齐。因为pandas和IPython的结合,在Jupyter中表现的更好:
接下来一切数据展现都运用Jupyter中的形态
数据量大的时分,这个特色会愈加杰出。咱们界说一个180行+3列的DataFrame数据:
index = pd.date_range('1/1/2000', periods=180)
df = pd.DataFrame(np.random.randn(180, 3), index=index, columns=list('ABC'))
它看起来是这样:
会主动省略中心段的数据,只显示头部和尾部的数据详情。
咱们能够自己试试numpy中的数据显示,代码如下:
np.random.randn(180, 3)
Pandas支撑多级索引
咱们持续往成果表上汇入同学以及性别数据,如下:
名字 | 性别 | 数学 | 语文 | 英语 |
---|---|---|---|---|
小恩 | 男 | 98 | 86 | 90 |
小西 | 女 | 96 | 92 | 93 |
小游 | 男 | 84 | 78 | 70 |
小存 | 女 | 80 | 99 | 93 |
在pandas中能够运用多重索引界说:
datas = [[98,86,90],[84,78,70],[96,92,93],[80,99,93]]
arrays = [['male', 'male', 'female', 'female'],["xiaoen", "xiaoyou", "xiaoxi", "xiaocun"]]
index = pd.MultiIndex.from_arrays(arrays, names=('gender','name'))
df = pd.DataFrame(datas, columns=["math","chn","eng"], index=index)
数据长这样的:
为了让二级索引看起来更明晰,我调整了一下数据的次序。有了二级索引,咱们能够很方便的查找女生/男生的成果数据
df.query('gender == "male"')
Pandas支撑动态结构数据
在之前的成果表上,咱们持续汇入一些选修课的成果,扩大数据的维度:
名字 | 性别 | 数学 | 语文 | 英语 | 政治 | 前史 | 物理 | 化学 |
---|---|---|---|---|---|---|---|---|
小恩 | 男 | 98 | 86 | 90 | 89 | 78 | – | – |
小西 | 女 | 96 | 92 | 93 | 92 | 88 | – | – |
小游 | 男 | 84 | 78 | 70 | – | – | 89 | 78 |
小存 | 女 | 80 | 99 | 93 | – | – | 92 | 88 |
咱们能够发现一些同学的选修课成果是空,这样会糟蹋一些数据存储空间。假如在数据库中,咱们大概会规划成这样:
名字 | 性别 | 科目 | 成果 |
---|---|---|---|
小恩 | 男 | 数学 | 98 |
小恩 | 男 | 语文 | 86 |
小恩 | 男 | 英语 | 90 |
小恩 | 男 | 政治 | 89 |
小恩 | 男 | 前史 | 78 |
小西 | 女 | 数学 | 96 |
小西 | 女 | 语文 | 92 |
小西 | 女 | 英语 | 93 |
小西 | 女 | 政治 | 92 |
小西 | 女 | 前史 | 88 |
小游 | 男 | 数学 | 84 |
小游 | 男 | 语文 | 78 |
小游 | 男 | 英语 | 70 |
小游 | 男 | 物理 | 89 |
小游 | 男 | 化学 | 78 |
小存 | 女 | 数学 | 80 |
小存 | 女 | 语文 | 99 |
小存 | 女 | 英语 | 93 |
小存 | 女 | 物理 | 92 |
小存 | 女 | 化学 | 88 |
实际情况下会规划多张表比如成员信息表,科目数据表等
简单的说咱们的数据结构中行是不确定的,列也是不确定。在pandas中这样界说:
datas = [[98,86,90,89,78,np.NaN,np.NaN],[96,92,93,92,88,np.NaN,np.NaN],[84,78,70,np.NaN,np.NaN,89,78],[80,99,93,np.NaN,np.NaN,92,88]]
df = pd.DataFrame(datas, columns=["math","chn","eng","pol","his","phy","che"], index=["xiaoen","xiaoxi", "xiaoyou", "xiaocun"])
df
- 留意我这里疏忽了性别数据
它长这样:
换个方式后检查:
可能咱们的上面数据最多只要7列,所以这种动态结构的支撑会有点多此一举的滋味。假如数据量变大后,这个特性就非常重要了。
比如下面表是大A股2022年的一切票的收盘价,因为股票数量和日期的不确定,咱们的结构化数据只能够运用下面方式构建:
在pandas中,咱们能够很简单转化出m*n的多维表:
- 表的行和列都是不确定并且巨大的
这种转化最主要的作用是能够快速的计算每只股票的收益率:
小结
咱们从学生成果开端,逐渐从一维数据扩展到多维数据,从队伍确定的静态数据结构到队伍不确定的动态数据结构,演示了Pandas怎么创立数据,并且怎么和Jupyter结合更好的展现数据,这让数据剖析更简单运用。
当然Pandas提供了更多更强壮的功能,有爱好的同学能够检查参阅链接去了解。
原创不易,请咱们多多三连支撑~~~
参阅链接
- www.pypandas.cn/