今天将带来第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天再见~
第四天学习了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