Pandas学习 (一).前言:(二).Pandas的安装:(三).Pandas对象简介:
1.Pandas的Series对象
1.1 Series是通用的Numpy数组 1.2. Series是特殊的字典1.3. 创建Series对象 2. Pandas的Dataframe对象
2.1.Dataframe是通用的Numpy数组2.2. Dataframe是特殊的字典2.3.创建Dataframe对象
2.3.1通过单个Series创建.2.3.2 通过字典列表创建:2.3.3 还有一种就是上述2.1.所示例的创建方法.2.3.4 通过Numpy二维数组创建.2.3.5 通过Numpy结构化数组创建. 3.Pandas的index对象
3.1.将index看做成一个不可变数组 3.2.将Index看作有序集合 (四)数据取值与选择
1 Series的数据选择方法1.1把Series当作字典1.2.同理也可以将Series当作一维数组1.3. 使用索引器:loc,iloc和ix(不常用).
1.3.1 第一种就是loc属性,表示取值和切片都是显式索引1.3.2第二种就是iloc属性表示都用的是隐式索引1.3.3第三种属性就是ix 2.Dataframe的数据选择方法2.1将Dataframe看作字典2.2将Dataframe理解为加强版的二维数组2.3使用loc,iloc (五)Pandas数值运算方法
(一).前言:Pandas是建立在Numpy数据结构上的,尤其时它的Series 和Dataframe对象,为数据科学家们处理那些消耗大量时间的"数据清理"任务提供了捷径.
下面我将重点介绍Series ,Dataframe和其他数据结构的高效使用方法.
在安装Pandas之前首相要确保你已经安装了Numpy,详细的安装方法,请参考Pandas官方文档(http://pandas.pydata.org/).
(三).Pandas对象简介:三个基本数据结构:Series,Dataframe,和Index.1.Pandas的Series对象 1.1 Series是通用的Numpy数组
Series对象和一维Numpy数组基本可以等价交换,本质差异就是索引:
Numpy通过隐式定义的整数索引获取数值,而Series使用一种显式定义的索引与数值关联,意思就是索引不单单可以是整数,还可以是任意想要的类型,例如:字符串,浮点数等等.
data = pd.Series([0.25,0.5,0.75,1.0],index=['a','b','c','d']) print(data)
输出结果:
a 0.25 b 0.50 c 0.75 d 1.00 dtype: float64
也可以使用不连续或者不按顺序的索引:
data = pd.Series([0.25,0.5,0.75,1.0],index=[2,5,3,7]) print(data)
输出结果:
2 0.25 5 0.50 3 0.75 7 1.00 dtype: float64 进程已结束,退出代码为 01.2. Series是特殊的字典
Series其实是一种将类型键映射到类型值的数据结构.
我们可以直接使用字典创建一个Series对象:
area_dict={'California':423967,'Texas':605662,'New York':141297,'Florida':170312,'Illinois':149995}
area=pd.Series(area_dict)
print(area)
输出结果:
California 423967 Texas 605662 New York 141297 Florida 170312 Illinois 149995 dtype: int64
用字典创建Series时,典型的字典数值获取方式仍然有效
print(population['California'])1.3. 创建Series对象
上述几种创建方式都是这样的形式
pd.Series(data,index=index)
其中index是一个可选参数,data参数支持多种数据类型.
例如:data可以是一个Numpy数组
pd.Series([2,4,6])
输出结果:
0 2 1 4 2 6 dtype: int64
data也可以是一个标量,创建时会重复填充到每一个索引上:
pd.Series(5,index=[100,200,300])
输出结果:
100 5 200 5 300 5 dtype: int64
data还可以是一个字典,index默认是排序的字典键:
pd.Series({2:'a',1:'b',3:'c'})
输出结果:
2 a 1 b 3 c dtype: object
每一种形式都可以通过显式指定索引:
pd.Series({2:'a',1:'b',3:'c'},index=[3,2])
输出结果:
3 c 2 a dtype: object
需要注意的是,Series只会保留显式定义的键值对.
2. Pandas的Dataframe对象Pandas的另一个基础数据结构就是Dataframe.也可以作为Numpy的一个通用类型数组,也可以看作特殊的字典.
2.1.Dataframe是通用的Numpy数组前面我们了解到了,Series是有灵活的行索引的一维数组,那么Daraframe就可以看做,是一种既具有灵活的行索引,还具有灵活的列名的二维数组.
population_dict={'California':38332521,'Texas':26448193,'New
York':19651127,'Florida':19552860,'Illinois':12882135}
population=pd.Series(population_dict)
area_dict={'California':423967,'Texas':605662,'New York':141297,'Florida':170312,'Illinois':149995}
area=pd.Series(area_dict)
states=pd.Dataframe({'population':population,'area':area})
print(states)
输出结果:
population area California 38332521 423967 Texas 26448193 605662 New York 19651127 141297 Florida 19552860 170312 Illinois 12882135 149995 进程已结束,退出代码为 0
可以看到Dataframe类似于二维数组,具有列名的对象
和Series一样,Dataframe也有index属性可以获取索引标签:
print(states.index)
输出结果:
Index(['California', 'Texas', 'New York', 'Florida', 'Illinois'], dtype='object')
另外,Dataframe还有一个columns属性,是存放列标签的index对象:
print(states.columns)
输出结果:
Index(['population', 'area'], dtype='object')2.2. Dataframe是特殊的字典
Dataframe是一种一列映射一个Series值的数据.例如:通过area可以返回包含列属性的Series对象:
print(states['area'])
输出结果:
California 423967 Texas 605662 New York 141297 Florida 170312 Illinois 149995 Name: area, dtype: int64 进程已结束,退出代码为 0
注意:在Numpy二维数组里面,data[0]是返回第一行,而Dataframe中data[‘col0’]是返回第一列
2.3.创建Dataframe对象 2.3.1通过单个Series创建.Dataframe是多个Series对象的集合,可以用单个Series来创建一个单列的Dataframe:
population_dict={'California':38332521,'Texas':26448193,'New York':19651127,'Florida':19552860,'Illinois':12882135}
population=pd.Series(population_dict)
states=pd.Dataframe({'population':population,'area':area})
data=pd.Dataframe(population,columns=['population'])
print(data)
输出结果:
population California 38332521 Texas 26448193 New York 19651127 Florida 19552860 Illinois 12882135 进程已结束,退出代码为 02.3.2 通过字典列表创建:
data=[{'a':i,'b':i*2}
for i in range(0,3)]
data01=pd.Dataframe(data)
print(data01)
输出结果:
a b 0 0 0 1 1 2 2 2 4
即使字典中的有些键不存在,Pandas也会用NaN来表示:
data=pd.Dataframe([{'a':1,'b':2},{'b':3,'c':4,'d':5}])
print(data)
输出结果:
a b c d 0 1.0 2 NaN NaN 1 NaN 3 4.0 5.02.3.3 还有一种就是上述2.1.所示例的创建方法.
通过Series对象构成的字典
2.3.4 通过Numpy二维数组创建.假如有一个二维数组,就可以创建一个指定行索引的Dataframe对象,如果不指定,那么就默认是整数索引值.
data01=pd.Dataframe(np.random.rand(3,2),index=['a','b','c'],columns=['num1','num2']) print(data01)
输出结果:
#这个是指定行索引
num1 num2
a 0.558924 0.558841
b 0.294003 0.305038
c 0.625494 0.760208
#这个是未指定行索引
num1 num2
0 0.065357 0.172990
1 0.831366 0.892077
2 0.726851 0.422833
进程已结束,退出代码为 0
2.3.5 通过Numpy结构化数组创建.
A=np.zeros(3,dtype=[('A','i8'),('B','f8')])
print(A)
a=pd.Dataframe(A)
print(a)
输出结果:
[(0, 0.) (0, 0.) (0, 0.)] A B 0 0 0.0 1 0 0.0 2 0 0.0 进程已结束,退出代码为 03.Pandas的index对象
index是一个很有趣的数据结构,我们可将它看做成一个有序集合,或者不可变数组.
3.1.将index看做成一个不可变数组index许多操作都很像数组.我们试着用一个简单的整数列表来创建一个index对象:
ind=pd.Index([2,3,5,7,11])
然后对其进行简单的数组操作:
#取值 print(ind[1]) #切片 print(ind[::2])
输出结果:
3 Int64Index([2, 5, 11], dtype='int64')
Index还有许多与数组相类似的属性:
print(ind.shape,ind.size,ind.ndim,ind.dtype)
输出结果:
(5,) 5 1 int64
Index对象与数组不同之处在于,Index对象的索引是不可变的
这个特点的好处就是,可以避免因粗心大意而修改索引值的副作用,多个Dataframe与数组之间进行索引共享时更加安全.
Index遵循python标准库集合用法,包括并集,交集,差集等
indA=pd.Index([1,2,3,4,5]) indB=pd.Index([3,4,5,6,7]) print(indA&indB)#交集 print(indA|indB)#并集 print(indA^indB)#差集
输出结果:
Int64Index([3, 4, 5], dtype='int64')#交集 Int64Index([1, 2, 3, 4, 5, 6, 7], dtype='int64')#并集 Int64Index([1, 2, 6, 7], dtype='int64')#差集
这些操作还可以用调用对象方法来实现例如:indA.intersection(intB)
(四)数据取值与选择 1 Series的数据选择方法 1.1把Series当作字典和字典一样series提供了键值对的映射:
import pandas as pd data=pd.Series([1,2,3,4],index=['a','b','c','d']) print(data['a'])
输出结果:
1
还可以用字典的语法来调整Series
增添新的索引值来扩展Series
data['e']=5 print(data)
输出结果:
a 1 b 2 c 3 d 4 e 5 dtype: int64 进程已结束,退出代码为 01.2.同理也可以将Series当作一维数组 1.3. 使用索引器:loc,iloc和ix(不常用).
由于上述方法容易混淆显式索引和隐式索引,毕竟整数索引就很容易混淆
所以Pandas就提供了索引器属性.
import pandas as pd data=pd.Series([1,2,3,4],index=['a','b','c','d']) print(data.loc['a']) print(data.loc['a':'d'])
输出结果:
1 a 1 b 2 c 3 d 4 dtype: int64 进程已结束,退出代码为 01.3.2第二种就是iloc属性表示都用的是隐式索引
data=pd.Series([1,2,3,4],index=['a','b','c','d']) print(data.iloc[1]) print(data.iloc[0:3])
输出结果:
2 a 1 b 2 c 3 dtype: int641.3.3第三种属性就是ix
pandas版本0.20.0及其以后版本中,ix已经不被推荐使用
这个属性就是前两种属性的混合形式,我强烈建议使用前两种索引器,避免误用索引,也是自己的代码更容易理解.
先用字典的形式创建一个Dataframe对象;
import pandas as pd
num01=pd.Series({'a':11,'b':22,'c':33})
num02=pd.Series({'a':1,'b':2,'c':3})
num=pd.Dataframe({'num01':num01,'num02':num02})
print(num)
输出:
num01 num02 a 11 1 b 22 2 c 33 32.1将Dataframe看作字典
这个和Series是一样的,不多做解释.
2.2将Dataframe理解为加强版的二维数组这样我们就可以对它进行更多操作,例如:
转置: num.T
取单行:
print(num.values[0])
输出:
[11 1]
取单列:
print(num.num01)
输出:
a 11 b 22 c 33 Name: num01, dtype: int642.3使用loc,iloc
print(num.iloc[:3, :2]) print(num.loc[:'c',:'num02'])
输出:
num01 num02 a 11 1 b 22 2 c 33 3 num01 num02 a 11 1 b 22 2 c 33 3
任何一种方法都可调整数据,这一点和Numpy的常用方法是相同的:
num.iloc[0]=90
输出:
num01 num02 a 90 90 b 22 2 c 33 3(五)Pandas数值运算方法



