第4天:欢迎光临Pandas



今天将带来第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被称为“PythonData 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!

 

上面是在ipythonnotebook中(一个嵌入在浏览器中的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中,结果的显示没有ipythonnotebook美观,所以下面的例子我用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天再见~

 

来自 <http://mp.weixin.qq.com/s?__biz=MjM5MDEzNDAyNQ==&mid=402568021&idx=1&sn=66d5234a31f2de640baa71439f856a33&scene=21>

 

 

第四天学习了Pandas,感受了Pandas数据的DataFrame数据格式的魅力:

 

 

看起来就像excel一样清爽!

 

但是后来我遇到了两个问题:

 

1)之前只学习了用字典来生成,列表可以生成吗?

 

2)字典生成也存在问题:想把{'A': 'a', 'B':'b'}变成DataFrame就不行:

 

importpandas as pd

 

>>>df = pd.DataFrame({'A': 'a', 'B': 'b'})

 

Traceback(most recent call last):

 File "<pyshell#5>", line 1, in <module>

   df = pd.DataFrame({'A': 'a', 'B': 'b'})

 File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 226,in __init__

   mgr = self._init_dict(data, index, columns, dtype=dtype)

 File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 363,in _init_dict

   dtype=dtype)

 File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 5158,in _arrays_to_mgr

   index = extract_index(arrays)

 File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 5197,in extract_index

   raise ValueError('If using all scalar values, you must pass'

ValueError: If using all scalar values, you must passan index

 

 

对这两个问题,查了资料,得到解决,现记录在此:

 

1)列表生成DataFrame:

 

直接DataFrame就可以,和字典一样

 

 

但是问题来了:

 

“索引名和变量名能改一下吗?”

 

自定义索引名,就用第四天里学的index=[ ]即可:

 

 

那么想自定义变量名呢?

 

哎这个,您啊,可以关注第五天的日记,我继续分享~

 

2)字典生成DataFrame的问题

 

import pandas as pd

 

>>> df = pd.DataFrame({'A': 'a', 'B': 'b'})

 

不成功,得到一堆错误提示

 

第四天学的就是用字典来生成DataFrame,怎么到这里不成功了?

 

您看看第四天的例子中的字典是什么样的:

 

>>> 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'], ‘pop': [2884.6, 2301.9] }

 

而出错的那个是这样的:

 

{'A': 'a', 'B': 'b'}

 

区别在哪呢?该不会是[ ]的问题吧——是的。

 

所以,将字典生成DataFrame,您可以用{'A':['a'], 'B': ['b']},当然也不一定非要这样,所以三种方法是可以成功的:

 

第一种:{'A':['a'], 'B': ['b']}

>>>df = pd.DataFrame({'A': ['a'], 'B': ['b']})

>>>df

  A  B

0 a  b

 

第二种:传入索引index

>>> df = pd.DataFrame({'A': 'a', 'B': 'b'}, index=[0])

>>>df

  A  B

0 a  b

 

第三种:DataFrame([dict])

>>> df = pd.DataFrame([{'A': 'a', 'B': 'b'}])

>>>df

  A  B

0 a  b

 

来自 <http://mp.weixin.qq.com/s?__biz=MjM5MDEzNDAyNQ==&mid=402636351&idx=1&sn=b18634d3299360582d17f0365ea190bd&scene=21>

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值