微信号:shushuojun

介绍:数据分析师之家.旨在为数据人提供一个学习、分享、互帮互助的家园.

统计师的Python日记【第4天:欢迎光临Pandas】

2016-03-09 01:21 数说君


本文是【统计师的Python日记】第4天的日记


回顾一下:


第1天学习了Python的基本页面、操作,以及几种主要的容器类型;

第2天学习了python的函数、循环和条件、类。

第3天了解了Numpy这个工具库。


原文复习(点击查看):


【第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”,它:


  • 是基于Numpy的一种工具库;

  • 提供了大量能使我们快速便捷处理数据的函数和方法;

  • 最初被作为金融数据分析根据被开发出来;

  • 集成了时间序列功能;

  • 对缺失值的灵活处理能力;

  • ......


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天再见~



1. 关于数据分析的提问求助直接在微信后台留言。


2. 转载、投稿、免费发布招聘、合作,请加数说君个人微信AnselT,或Email:jiayounet@163.com。


数说工作室

一个专门研究数据的工作室 | 金融 生物 零售 互联网

微信ID:shushuojun


长按二维码关注数说工作室

 
数说工作室 更多文章 导语:SAS正则表达式,统计师入门文本分析的捷径 讨论 | 数据分析的价值 日本 | 医疗大数据值得关注的3个方向 统计师的Python日记【第6天:数据合并】 统计师的Python日记【第5天:Pandas,露两手】
猜您喜欢 总结2015,展望2016 这你都不知道,别说你懂色彩 携程Android App插件化和动态加载实践 Visual Studio一秒变Node.js IDE [精校版]Using Swift with Cocoa and Objective-C--Mix and Match