本文是【统计师的Python日记】第4天的日记
回顾一下:
第1天学习了Python的基本页面、操作,以及几种主要的容器类型;
第2天学习了python的函数、循环和条件、类。
第3天了解了Numpy这个工具库。
原文复习(点击查看):
今天将带来第4天的学习日记。
目录如下:
前言
一、Series
二、Dataframe
1. 数据结构
2. 基本操作
(1)改变索引名
(2)增加一列
(3)排序
(4)删除一列
统计师的Python日记【第4天:欢迎光临Pandas】
前言
第3天我发了一个愿,学Python我的计划是:
Numpy → Pandas → 掌握一些数据清洗、规整、合并等功能 → 掌握类似与SQL的聚合等数据管理功能 → 能够用Python进行统计建模、假设检验等分析技能 → 能用Python打印出100元钱 → 能用Python帮我洗衣服、做饭 → 能用Python给我生小猴子......
我不是一名程序员,不写网站(以后可能会爬一爬网站的数据)、不搞支付系统、不处理多媒体、也不想当黑客,学Python主要目的就是玩数据、做分析,c成为一名进阶的统计师,以后可能的话搞一搞大数据。
在这样的角色设定之下,Pandas就一定要学好!Pandas被称为“Python Data Analysis Li”,它:
Pandas有两种主要的数据结构:Series和Dataframe,前者是一维的,后者是多维的(表格型)。
一、Series
Series由一组数据和对应的索引组成,看个例子:
>>> a=pd.Series([7,6,5,4]) >>> a 0 7 1 6 2 5 3 4 dtype: int64
我们也可以用index=来指定索引:
>>> a=pd.Series([7,6,5], index=['shu','shuo','jun']) >>> a shu 7 shuo 6 jun 5 dtype: int64
“艾玛,这不有点像第1天学的字典吗?”我心想。
打开第一天的日记复习一下吧→【第1天:谁来给我讲讲Python?】
在操作上也像字典,对比一下a(字典)和b(Series):
>>> a=dict(name='jiayounet', age='27') >>> a {'age': '27', 'name': 'jiayounet'} >>> a['age'] '27' >>> 'age' in a True >>> 'haha' in a False >>> b=pd.Series([7,6,5], index=['shu','shuo','jun']) >>> b shu 7 shuo 6 jun 5 dtype: int64 >>> b['shu'] 7 >>> 'shu' in b True >>> 'haha' in b False
实际上,字典也确实可以直接变身成为Series!比如下面的字典a,储存了每个地区的平均工资,将其变为Series:
>>> a=dic{'Beijing':7000, 'Shanghai':8000, 'Shenzhen':7700, 'Nanjing':4700} >>> a {'Beijing': 7000, 'Shanghai': 8000, 'Nanjing': 4700, 'Shenzhen': 7700} >>> pd.Series(a) Beijing 7000 Nanjing 4700 Shanghai 8000 Shenzhen 7700 dtype: int64
也可以指定索引:
>>> pd.Series(a, index=['Beijing', 'Shanghai']) Beijing 7000 Shanghai 8000 dtype: int64
二、DataFrame
1. 数据结构
DataFrame是一个表格型的数据结构。
下面的这组数据,储存了2015年中国人口前十的城市,以及它们拥有的人口
非常清爽的一张表,它~就~是~DataFrame!
上面是在ipython notebook中(一个嵌入在浏览器中的shell!)显示的,如果在Python自带的shell中,显示出来是这样的:
也不差啊!
那么怎么才能生成这样一张表呢?最常用的方法,是用字典生成:
>>> pop={'city':['Chongqin', 'Shanghai', 'Beijing', 'Chengdu', 'Tianjin', 'Guangzhou', 'Baoding', 'Harbin', 'Suzhou', 'Shenzhen'], 'pop':[2884.6, 2301.9, 1961.2, 1404.8, 1293.8, 1270.1, 1119.4, 1063.6, 1046.6, 1035.8]} >>> pop {'city': ['Chongqin', 'Shanghai', 'Beijing', 'Chengdu', 'Tianjin', 'Guangzhou', 'Baoding', 'Harbin', 'Suzhou', 'Shenzhen'], 'pop': [2884.6, 2301.9, 1961.2, 1404.8, 1293.8, 1270.1, 1119.4, 1063.6, 1046.6, 1035.8]} >>> pop_DF=pd.DataFrame(pop) >>> pop_DF city pop 0 Chongqin 2884.6 1 Shanghai 2301.9 2 Beijing 1961.2 3 Chengdu 1404.8 4 Tianjin 1293.8 5 Guangzhou 1270.1 6 Baoding 1119.4 7 Harbin 1063.6 8 Suzhou 1046.6 9 Shenzhen 1035.8
也可以用columns=[]来指定某列:
>>> pop_DF=pd.DataFrame(pop, columns=['city']) >>> pop_DF city 0 Chongqin 1 Shanghai 2 Beijing 3 Chengdu 4 Tianjin 5 Guangzhou 6 Baoding 7 Harbin 8 Suzhou 9 Shenzhen
2. 基本操作
认识几个基本操作,加深一下印象。
(1)改变索引名
刚刚的城市人口数据,我们有10个城市,索引是0~9,我们不想用这么单调的数字来做索引,想用每个城市的简称来表示,和Series一样,可以用index=来指定索引:
(因为Python自带的shell中,结果的显示没有ipython notebook美观,所以下面的例子我用ipython notebook的结果来展示)
注:语句为
pop_DF=DataFrame(pop, index=['Yu', 'Hu', 'Jing', 'Rong', 'Jin', 'Sui', 'Bao', 'Ha', 'Su', 'Shen'])
(2)增加一列
如何给DataFrame增加一列?还是以刚刚城市人口的数据pop_DF为例,我们来增加一列,给每个城市打上“China”的标记:
有时候增加的这一列不一定全,可能有缺失,比如再给每个城市增加一列归属省份,但是本人地理差,只知道广州属于广东,苏州属于江苏,那么我可以这么加:
这里我get了两点:
1. 可以用Series来按照索引的匹配来增加一列;
2. 缺失的地方会用NaN来表示。
(3)排序
作为统计师,排序是常见的,我想到的以后可能用到的至少有这几种:
人为给定顺序;
按照索引来自动排序:升序、降序;
按照某一变量来自动排序;
好吧,一个一个来学:
用reindex函数,可以人为的给定顺序,想让谁在前面谁就在前面。
比如,我们按照首字母来人为给定如下顺序
注:语句为
pop_DF2=pop_DF.reindex(['Bao', 'Ha', 'Hu', 'Jin', 'Jing', 'Rong', 'Shen', 'Su', 'Sui', 'Yu'])
这时我有一个问题了:要是reindex中出现了不存在的索引怎么办?
比如上例中pop_DF2的“Chu”,结果全面变量都是缺失的。
可以用 .sort_index() 来让数据按照索引自动排序。
在上例中,我们多了一个索引为“Chu”的空数据,并且在Bao的前面,我们再用sort_index()让它按照字母顺序自动重排一下。
这是默认的升序排列,也可以降序,只要指定ascending=False就可以:
pop_DF2.sort_index(ascending=False)
我们可以用 .sort_values( by = '' ) 来指定某一个变量来排序:
我们回到pop_DF这个数据:
让它按照pop来排序:
(4)删除一列
前面学的是改变索引名、增加一列、各种排序,好像少掉了什么——如何删掉一列和一行...
用 .drop() 就可以删掉指定的索引行,比如我们想删掉pop_DF中,人口大于2000(万)的城市,也就是重庆和上海,对于的索引(也就是简称)为:Yu和Hu
那么删掉一列呢?
也是用 .drop() ,指定一下要删的列变量,并且加一句 axis=1 。
今天的学习结束!
Series、DataFrame、玩索引、各种增、各种删、各种排序......今天学的很过瘾,学完这些,我想我真正算得上——入门Pandas啦!
哎呦,第5天再见~