Pandas之:Pandas高级教程以铁达尼号真实数据为例

简介

今天我们会讲解一下Pandas的高级教程,包括读写文件、选取子集和图形表示等。

读写文件

数据处理的一个关键步骤就是读取文件进行分析,然后将分析处理结果再次写入文件。

Pandas支持多种文件格式的读取和写入:

  1. In [108]: pd.read_
  2. read_clipboard() read_excel() read_fwf() read_hdf() read_json read_parquet read_sas read_sql_query read_stata
  3. read_csv read_feather() read_gbq() read_html read_msgpack read_pickle read_sql read_sql_table read_table

接下来我们会以Pandas官网提供的Titanic.csv为例来讲解Pandas的使用。

Titanic.csv提供了800多个泰坦利特号上乘客的信息,是一个891 rows x 12 columns的矩阵。

我们使用Pandas来读取这个csv:

  1. In [5]: titanic=pd.read_csv("titanic.csv")

read_csv方法会将csv文件转换成为pandas 的DataFrame

默认情况下我们直接使用DF变量,会默认展示前5行和后5行数据:

  1. In [3]: titanic
  2. Out[3]:
  3. PassengerId Survived Pclass Name Sex ... Parch Ticket Fare Cabin Embarked
  4. 0 1 0 3 Braund, Mr. Owen Harris male ... 0 A/5 21171 7.2500 NaN S
  5. 1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female ... 0 PC 17599 71.2833 C85 C
  6. 2 3 1 3 Heikkinen, Miss. Laina female ... 0 STON/O2. 3101282 7.9250 NaN S
  7. 3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female ... 0 113803 53.1000 C123 S
  8. 4 5 0 3 Allen, Mr. William Henry male ... 0 373450 8.0500 NaN S
  9. .. ... ... ... ... ... ... ... ... ... ... ...
  10. 886 887 0 2 Montvila, Rev. Juozas male ... 0 211536 13.0000 NaN S
  11. 887 888 1 1 Graham, Miss. Margaret Edith female ... 0 112053 30.0000 B42 S
  12. 888 889 0 3 Johnston, Miss. Catherine Helen "Carrie" female ... 2 W./C. 6607 23.4500 NaN S
  13. 889 890 1 1 Behr, Mr. Karl Howell male ... 0 111369 30.0000 C148 C
  14. 890 891 0 3 Dooley, Mr. Patrick male ... 0 370376 7.7500 NaN Q
  15. [891 rows x 12 columns]

可以使用head(n)和tail(n)来指定特定的行数:

  1. In [4]: titanic.head(8)
  2. Out[4]:
  3. PassengerId Survived Pclass Name Sex ... Parch Ticket Fare Cabin Embarked
  4. 0 1 0 3 Braund, Mr. Owen Harris male ... 0 A/5 21171 7.2500 NaN S
  5. 1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female ... 0 PC 17599 71.2833 C85 C
  6. 2 3 1 3 Heikkinen, Miss. Laina female ... 0 STON/O2. 3101282 7.9250 NaN S
  7. 3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female ... 0 113803 53.1000 C123 S
  8. 4 5 0 3 Allen, Mr. William Henry male ... 0 373450 8.0500 NaN S
  9. 5 6 0 3 Moran, Mr. James male ... 0 330877 8.4583 NaN Q
  10. 6 7 0 1 McCarthy, Mr. Timothy J male ... 0 17463 51.8625 E46 S
  11. 7 8 0 3 Palsson, Master. Gosta Leonard male ... 1 349909 21.0750 NaN S
  12. [8 rows x 12 columns]

使用dtypes可以查看每一列的数据类型:

  1. In [5]: titanic.dtypes
  2. Out[5]:
  3. PassengerId int64
  4. Survived int64
  5. Pclass int64
  6. Name object
  7. Sex object
  8. Age float64
  9. SibSp int64
  10. Parch int64
  11. Ticket object
  12. Fare float64
  13. Cabin object
  14. Embarked object
  15. dtype: object

使用to_excel可以将DF转换为excel文件,使用read_excel可以再次读取excel文件:

  1. In [11]: titanic.to_excel('titanic.xlsx', sheet_name='passengers', index=False)
  2. In [12]: titanic = pd.read_excel('titanic.xlsx', sheet_name='passengers')

使用info()可以来对DF进行一个初步的统计:

  1. In [14]: titanic.info()
  2. <class 'pandas.core.frame.DataFrame'>
  3. RangeIndex: 891 entries, 0 to 890
  4. Data columns (total 12 columns):
  5. PassengerId 891 non-null int64
  6. Survived 891 non-null int64
  7. Pclass 891 non-null int64
  8. Name 891 non-null object
  9. Sex 891 non-null object
  10. Age 714 non-null float64
  11. SibSp 891 non-null int64
  12. Parch 891 non-null int64
  13. Ticket 891 non-null object
  14. Fare 891 non-null float64
  15. Cabin 204 non-null object
  16. Embarked 889 non-null object
  17. dtypes: float64(2), int64(5), object(5)
  18. memory usage: 83.6+ KB

DF的选择

选择列数据

DF的head或者tail方法只能显示所有的列数据,下面的方法可以选择特定的列数据。

  1. In [15]: ages = titanic["Age"]
  2. In [16]: ages.head()
  3. Out[16]:
  4. 0 22.0
  5. 1 38.0
  6. 2 26.0
  7. 3 35.0
  8. 4 35.0
  9. Name: Age, dtype: float64

每一列都是一个Series:

  1. In [6]: type(titanic["Age"])
  2. Out[6]: pandas.core.series.Series
  3. In [7]: titanic["Age"].shape
  4. Out[7]: (891,)

还可以多选:

  1. In [8]: age_sex = titanic[["Age", "Sex"]]
  2. In [9]: age_sex.head()
  3. Out[9]:
  4. Age Sex
  5. 0 22.0 male
  6. 1 38.0 female
  7. 2 26.0 female
  8. 3 35.0 female
  9. 4 35.0 male

如果选择多列的话,返回的结果就是一个DF类型:

  1. In [10]: type(titanic[["Age", "Sex"]])
  2. Out[10]: pandas.core.frame.DataFrame
  3. In [11]: titanic[["Age", "Sex"]].shape
  4. Out[11]: (891, 2)

选择行数据

上面我们讲到了怎么选择列数据,下面我们来看看怎么选择行数据:

选择客户年龄大于35岁的:

  1. In [12]: above_35 = titanic[titanic["Age"] > 35]
  2. In [13]: above_35.head()
  3. Out[13]:
  4. PassengerId Survived Pclass Name Sex ... Parch Ticket Fare Cabin Embarked
  5. 1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female ... 0 PC 17599 71.2833 C85 C
  6. 6 7 0 1 McCarthy, Mr. Timothy J male ... 0 17463 51.8625 E46 S
  7. 11 12 1 1 Bonnell, Miss. Elizabeth female ... 0 113783 26.5500 C103 S
  8. 13 14 0 3 Andersson, Mr. Anders Johan male ... 5 347082 31.2750 NaN S
  9. 15 16 1 2 Hewlett, Mrs. (Mary D Kingcome) female ... 0 248706 16.0000 NaN S
  10. [5 rows x 12 columns]

使用isin选择Pclass在2和3的所有客户:

  1. In [16]: class_23 = titanic[titanic["Pclass"].isin([2, 3])]
  2. In [17]: class_23.head()
  3. Out[17]:
  4. PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
  5. 0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
  6. 2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
  7. 4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
  8. 5 6 0 3 Moran, Mr. James male NaN 0 0 330877 8.4583 NaN Q
  9. 7 8 0 3 Palsson, Master. Gosta Leonard male 2.0 3 1 349909 21.0750 NaN S

上面的isin等于:

  1. In [18]: class_23 = titanic[(titanic["Pclass"] == 2) | (titanic["Pclass"] == 3)]

筛选Age不是空的:

  1. In [20]: age_no_na = titanic[titanic["Age"].notna()]
  2. In [21]: age_no_na.head()
  3. Out[21]:
  4. PassengerId Survived Pclass Name Sex ... Parch Ticket Fare Cabin Embarked
  5. 0 1 0 3 Braund, Mr. Owen Harris male ... 0 A/5 21171 7.2500 NaN S
  6. 1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female ... 0 PC 17599 71.2833 C85 C
  7. 2 3 1 3 Heikkinen, Miss. Laina female ... 0 STON/O2. 3101282 7.9250 NaN S
  8. 3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female ... 0 113803 53.1000 C123 S
  9. 4 5 0 3 Allen, Mr. William Henry male ... 0 373450 8.0500 NaN S
  10. [5 rows x 12 columns]

同时选择行和列

我们可以同时选择行和列。

使用loc和iloc可以进行行和列的选择,他们两者的区别是loc是使用名字进行选择,iloc是使用数字进行选择。

选择age>35的乘客名:

  1. In [23]: adult_names = titanic.loc[titanic["Age"] > 35, "Name"]
  2. In [24]: adult_names.head()
  3. Out[24]:
  4. 1 Cumings, Mrs. John Bradley (Florence Briggs Th...
  5. 6 McCarthy, Mr. Timothy J
  6. 11 Bonnell, Miss. Elizabeth
  7. 13 Andersson, Mr. Anders Johan
  8. 15 Hewlett, Mrs. (Mary D Kingcome)
  9. Name: Name, dtype: object

loc中第一个值表示行选择,第二个值表示列选择。

使用iloc进行选择:

  1. In [25]: titanic.iloc[9:25, 2:5]
  2. Out[25]:
  3. Pclass Name Sex
  4. 9 2 Nasser, Mrs. Nicholas (Adele Achem) female
  5. 10 3 Sandstrom, Miss. Marguerite Rut female
  6. 11 1 Bonnell, Miss. Elizabeth female
  7. 12 3 Saundercock, Mr. William Henry male
  8. 13 3 Andersson, Mr. Anders Johan male
  9. .. ... ... ...
  10. 20 2 Fynney, Mr. Joseph J male
  11. 21 2 Beesley, Mr. Lawrence male
  12. 22 3 McGowan, Miss. Anna "Annie" female
  13. 23 1 Sloper, Mr. William Thompson male
  14. 24 3 Palsson, Miss. Torborg Danira female
  15. [16 rows x 3 columns]

使用plots作图

怎么将DF转换成为多样化的图形展示呢?

要想在命令行中使用matplotlib作图,那么需要启动ipython的QT环境:

  1. ipython qtconsole --pylab=inline

直接使用plot来展示一下上面我们读取的乘客信息:

  1. import matplotlib.pyplot as plt
  2. import pandas as pd
  3. titanic = pd.read_excel('titanic.xlsx', sheet_name='passengers')
  4. titanic.plot()

横坐标就是DF中的index,列坐标是各个列的名字。注意上面的列只展示的是数值类型的。

我们只展示age信息:

  1. titanic['Age'].plot()

默认的是柱状图,我们可以转换图形的形式,比如点图:

  1. titanic.plot.scatter(x="PassengerId",y="Age", alpha=0.5)

选择数据中的PassengerId作为x轴,age作为y轴:

除了散点图,还支持很多其他的图像:

  1. [method_name for method_name in dir(titanic.plot) if not method_name.startswith("_")]
  2. Out[11]:
  3. ['area',
  4. 'bar',
  5. 'barh',
  6. 'box',
  7. 'density',
  8. 'hexbin',
  9. 'hist',
  10. 'kde',
  11. 'line',
  12. 'pie',
  13. 'scatter']

再看一个box图:

  1. titanic['Age'].plot.box()

可以看到,乘客的年龄大多集中在20-40岁之间。

还可以将选择的多列分别作图展示:

  1. titanic.plot.area(figsize=(12, 4), subplots=True)

指定特定的列:

  1. titanic[['Age','Pclass']].plot.area(figsize=(12, 4), subplots=True)

还可以先画图,然后填充:

  1. fig, axs = plt.subplots(figsize=(12, 4));

先画一个空的图,然后对其进行填充:

  1. titanic['Age'].plot.area(ax=axs);
  2. axs.set_ylabel("Age");
  3. fig

使用现有的列创建新的列

有时候,我们需要对现有的列进行变换,以得到新的列,比如我们想添加一个Age2列,它的值是Age列+10,则可以这样:

  1. titanic["Age2"]=titanic["Age"]+10;
  2. titanic[["Age","Age2"]].head()
  3. Out[34]:
  4. Age Age2
  5. 0 22.0 32.0
  6. 1 38.0 48.0
  7. 2 26.0 36.0
  8. 3 35.0 45.0
  9. 4 35.0 45.0

还可以对列进行重命名:

  1. titanic_renamed = titanic.rename(
  2. ...: columns={"Age": "Age2",
  3. ...: "Pclass": "Pclas2"})

列名转换为小写:

  1. titanic_renamed = titanic_renamed.rename(columns=str.lower)

进行统计

我们来统计下乘客的平均年龄:

  1. titanic["Age"].mean()
  2. Out[35]: 29.69911764705882

选择中位数:

  1. titanic[["Age", "Fare"]].median()
  2. Out[36]:
  3. Age 28.0000
  4. Fare 14.4542
  5. dtype: float64

更多信息:

  1. titanic[["Age", "Fare"]].describe()
  2. Out[37]:
  3. Age Fare
  4. count 714.000000 891.000000
  5. mean 29.699118 32.204208
  6. std 14.526497 49.693429
  7. min 0.420000 0.000000
  8. 25% 20.125000 7.910400
  9. 50% 28.000000 14.454200
  10. 75% 38.000000 31.000000
  11. max 80.000000 512.329200

使用agg指定特定的聚合方法:

  1. titanic.agg({'Age': ['min', 'max', 'median', 'skew'],'Fare': ['min', 'max', 'median', 'mean']})
  2. Out[38]:
  3. Age Fare
  4. max 80.000000 512.329200
  5. mean NaN 32.204208
  6. median 28.000000 14.454200
  7. min 0.420000 0.000000
  8. skew 0.389108 NaN

可以使用groupby:

  1. titanic[["Sex", "Age"]].groupby("Sex").mean()
  2. Out[39]:
  3. Age
  4. Sex
  5. female 27.915709
  6. male 30.726645

groupby所有的列:

  1. titanic.groupby("Sex").mean()
  2. Out[40]:
  3. PassengerId Survived Pclass Age SibSp Parch
  4. Sex
  5. female 431.028662 0.742038 2.159236 27.915709 0.694268 0.649682
  6. male 454.147314 0.188908 2.389948 30.726645 0.429809 0.235702

groupby之后还可以选择特定的列:

  1. titanic.groupby("Sex")["Age"].mean()
  2. Out[41]:
  3. Sex
  4. female 27.915709
  5. male 30.726645
  6. Name: Age, dtype: float64

可以分类进行count:

  1. titanic["Pclass"].value_counts()
  2. Out[42]:
  3. 3 491
  4. 1 216
  5. 2 184
  6. Name: Pclass, dtype: int64

上面等同于:

  1. titanic.groupby("Pclass")["Pclass"].count()

DF重组

可以根据某列进行排序:

  1. titanic.sort_values(by="Age").head()
  2. Out[43]:
  3. PassengerId Survived Pclass Name Sex \
  4. 803 804 1 3 Thomas, Master. Assad Alexander male
  5. 755 756 1 2 Hamalainen, Master. Viljo male
  6. 644 645 1 3 Baclini, Miss. Eugenie female
  7. 469 470 1 3 Baclini, Miss. Helene Barbara female
  8. 78 79 1 2 Caldwell, Master. Alden Gates male

根据多列排序:

  1. titanic.sort_values(by=['Pclass', 'Age'], ascending=False).head()
  2. Out[44]:
  3. PassengerId Survived Pclass Name Sex Age \
  4. 851 852 0 3 Svensson, Mr. Johan male 74.0
  5. 116 117 0 3 Connors, Mr. Patrick male 70.5
  6. 280 281 0 3 Duane, Mr. Frank male 65.0
  7. 483 484 1 3 Turkula, Mrs. (Hedwig) female 63.0
  8. 326 327 0 3 Nysveen, Mr. Johan Hansen male 61.0

选择特定的行和列数据,下面的例子我们将会选择性别为女性的部分数据:

  1. female=titanic[titanic['Sex']=='female']
  2. female_subset=female[["Age","Pclass","PassengerId","Survived"]].sort_values(["Pclass"]).groupby(["Pclass"]).head(2)
  3. female_subset
  4. Out[58]:
  5. Age Pclass PassengerId Survived
  6. 1 38.0 1 2 1
  7. 356 22.0 1 357 1
  8. 726 30.0 2 727 1
  9. 443 28.0 2 444 1
  10. 855 18.0 3 856 1
  11. 654 18.0 3 655 0

使用pivot可以进行轴的转换:

  1. female_subset.pivot(columns="Pclass", values="Age")
  2. Out[62]:
  3. Pclass 1 2 3
  4. 1 38.0 NaN NaN
  5. 356 22.0 NaN NaN
  6. 443 NaN 28.0 NaN
  7. 654 NaN NaN 18.0
  8. 726 NaN 30.0 NaN
  9. 855 NaN NaN 18.0
  10. female_subset.pivot(columns="Pclass", values="Age").plot()

本文已收录于 http://www.flydean.com/02-python-pandas-advanced/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

Pandas之:Pandas高级教程以铁达尼号真实数据为例的更多相关文章

  1. Pandas之:Pandas简洁教程

    Pandas之:Pandas简洁教程 目录 简介 对象创建 查看数据 选择数据 loc和iloc 布尔索引 处理缺失数据 合并 分组 简介 pandas是建立在Python编程语言之上的一种快速,强大 ...

  2. 高级教程: 作出动态决策和 Bi-LSTM CRF 重点

    动态 VS 静态深度学习工具集 Pytorch 是一个 动态 神经网络工具包. 另一个动态工具包的例子是 Dynet (我之所以提这个是因为使用 Pytorch 和 Dynet 是十分类似的. 如果你 ...

  3. pandas | 使用pandas进行数据处理——Series篇

    本文始发于个人公众号:TechFlow,原创不易,求个关注 上周我们关于Python中科学计算库Numpy的介绍就结束了,今天我们开始介绍一个新的常用的计算工具库,它就是大名鼎鼎的Pandas. Pa ...

  4. ios cocopods 安装使用及高级教程

    CocoaPods简介 每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如Java语言的Maven,nodejs的npm.随着iOS开发者的增多,业界也出现了为iOS程序提供依赖管理的工具,它的 ...

  5. 【读书笔记】.Net并行编程高级教程(二)-- 任务并行

    前面一篇提到例子都是数据并行,但这并不是并行化的唯一形式,在.Net4之前,必须要创建多个线程或者线程池来利用多核技术.现在只需要使用新的Task实例就可以通过更简单的代码解决命令式任务并行问题. 1 ...

  6. 【读书笔记】.Net并行编程高级教程--Parallel

    一直觉得自己对并发了解不够深入,特别是看了<代码整洁之道>觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准.而且在<失控>这本书中也多次提到并发,不管是计算机 ...

  7. 分享25个新鲜出炉的 Photoshop 高级教程

    网络上众多优秀的 Photoshop 实例教程是提高 Photoshop 技能的最佳学习途径.今天,我向大家分享25个新鲜出炉的 Photoshop 高级教程,提高你的设计技巧,制作时尚的图片效果.这 ...

  8. 展讯NAND Flash高级教程【转】

    转自:http://wenku.baidu.com/view/d236e6727fd5360cba1adb9e.html 展讯NAND Flash高级教程

  9. Net并行编程高级教程--Parallel

    Net并行编程高级教程--Parallel 一直觉得自己对并发了解不够深入,特别是看了<代码整洁之道>觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准.而且在<失控 ...

随机推荐

  1. 面试系列<5>——面向对象

    面试系列--面向对象思想 一.三大特性 封装 利用抽象数据类型将数据和基于数据的操作封装在一起,使其成为一个不可分割的独立实体.数据被保护在抽象数据类型内部,尽可能地隐藏内部细节,只保留一些对外的接口 ...

  2. 剑指Offer 55. 数组中的逆序对

    在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4]输出: 5 思路:运用归并排序的特点 ...

  3. E - Minimal Subarray Length(连续区间和)

    题目链接 题意:给出n个数,求加和大于x的最短区间的区间长度. 如果前i个数字和为y,那么如果前j数字的和小于等于y-x,那么i-j就是一种可能的情况,我们对于所有的i找出前面最大的j就可以了,因为数 ...

  4. hdu4909 状态压缩(偶数字符子串)

    题意:       给你一个字符串,里面最多有一个'?','?'可以表示'a' - 'z',也可以什么都不表 示,这里要明确,什么都不表示不是不存在的意思,当aa什么都不表示的时候aa 也不等于aa? ...

  5. 路由选择协议(RIP/OSPF)

    目录 IGP RIP协议 OSPF协议 IS-IS协议 EIGRP协议 EGP BGP 我们可能会想,在偌大的网络中,我们是如何跟其他人通信的呢?我们是如何跟远在太平洋对面的美国小伙伴对话的呢? 这就 ...

  6. Day006 可变参数

    可变参数(不定项参数) 在jdk1.5开始,java支持传递同类型的可变参数给一个方法. 在方法声明中,在指定参数类型后加一个省略号(...). 一个方法只能指定一个可变参数,它必须是方法的最后一个参 ...

  7. keep-alive与生命周期函数

    理解keep-alive keep-alive是Vue内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染 router-view也是一个组件,如果直接被keep-alive包在里面,所有路径匹 ...

  8. easy-flows源码研习

    一.项目概述 1.原项目github地址:https://github.com/j-easy/easy-flows.git 2.easy-flows可以用非常简易的api创建常用的可组合的工作流.涵盖 ...

  9. 前端必读:Vue响应式系统大PK

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://www.sitepoint.com/vue-3-reactivity-system ...

  10. algorithm库介绍之---- stable_sort()方法 与 sort()方法 .

    文章转载自:http://www.cnblogs.com/ffhajbq/archive/2012/07/24/2607476.html 关于stable_sort()和sort()的区别: 你发现有 ...