利用Python进行数据分析(五)之pandas入门
pandas入门
pandas毫无疑问是数据分析最基础的库之一。pandas是基于NumPy构建的。本书的作者就是pandas的作者~
引用:
from pandas import Series,DataFrame
import pandas as pd
pandas的数据结构(Series和DataFrame)
Series
Series由一组数据(各种NumPy数据类型)以及一组与之相关的索引组成。仅由一组数据即可产生最简单的Series:
In[4]:obj = Series([4,7,-5,3])
In[5]:obj
0ut[5]:
0 4
1 7
2 -5
3 3
你也可以通过values和index属性来获取值和索引:
In [6]:obj.values
Out[6]:array([4,7,-5,3])
In[7]:obj.index
Out[7]:Int64Index([o,1,2,3])
当然你可以指定索引,而不是默认的0~(length-1):
In [8]:obj2 = Series([4,7,-5,3],index=['d','b',‘a','c'])
In[9]:obj2
0ut[9]:
d 4
b 7
a -5
c 3
In[10]:obj2.index
0ut[10]:Index([d,b,a,c],dtype=object)
建立完了,当然要会怎么获取值啦:
In[11]:obj2['a']
0ut[11]:-5
In[12]:obj2['d'] = 6
In [13]:obj2[['c',‘a',‘d']]
0ut[13]:
c 3
a -5
d 6
NumPy数组运算都会保留索引和值之间的链接。
你很容易联想到有序字典,比如:
In [18]:'b'in obj2
0ut[18]:True
In [19]:'e'in obj2
0ut[19]:False
或者:
In [20]:sdata={'ohio':35000,‘Texas':71000,‘0regon':16000,‘Utah':5000}
In[21]:obj3=Series(sdata)
In[22]:obj3
out[22]:
ohio 35000
0regon 16000
Texas71000
Utah 5000
In[23]:states = ['California','Ohio',‘Oregon','Texas']
In[24]:obj4 = Series(sdata,index=states)
In [25]:obj4
0ut[25]:
California NaN
Ohio 35000
0regon 16000
Texas 71000
#可以理解为先建立index,全为NaN(not a number),然后把前面数组的值填到相应的索引下去。
用pandas的 isnull和notnull可检测缺失数据。
pd.innull(obj4) pd.notnull(obj4) obj4.isnull()返回索引+值(bool)
Series的自动对齐不同索引的数据被许多的应用来使用:
In[29]:obj3 In[30]:obj4
Out[29]: Out[30]:
Ohio 35000 California NaN
0regon 160000 hio 35000
Texas 710000 regon 16000
Utah 5000 Texas 71000
In [31]:obj3+obj4
0ut[31]:
California NaN
Ohio 70000
Oregon 32000
Texas 142000
Utah NaN
#Utah得到NaN比较特殊
Series对象本身及其索引都有一个name属性,该属性跟pandas其他的关键功能关系非常密切:
In [32]:obj4.name=‘population'
In[33]:obj4.index.name='state'
In [34]:obj4
0ut[34]:
state
California NaN
0hio35000
0regon16000
Texas71000
Name:population
Series的索引可以通过赋值的方式就地修改:
In [35]:obj.index=['Bob','Steve','Jeff','Ryan']
In [36]:obj
out[36]:
Bob 4
Steve 7
Jeff -5
Ryan 3
DataFrame
应该可以这么理解,DataFrame在pandas里就像表格一样的二维结构。(注意:虽然DataFrame是以二维结构保存数据的,但你仍然可以轻松地将其表示为更高维度的数据(层次化索引的表格型结构,这是pandas中许多高级数据处理功能的关键要素))
data={'state':['ohio','ohio','ohio','Nevada','Nevada'],
'year':[2000,2001,2002,2001,2002],
'pop':[1.5,1.7,3.6,2.4,2.9]}
frame = DataFrame(data)
In[38]:frame
0ut[38]:
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
In [40]:frame2 = DataFrame(data,columns=['year','state',‘pop','debt'],
index = ['one','two','three','four','five'])
In [41]:frame2
0ut[41]:
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 NaN
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 NaN
five 2002 Nevada 2.9 NaN
#通过columns可以指明列顺序,没有值则为NaN
通过frame2['state']或者frame2.state可获取到Series:
one Ohio
two Ohio
three Ohio
four Nevada
five Nevada
Name:state
frame2.ix['three'] :索引字段ix
frame2['debt'] = 16.5 :列赋值
frame2['debt'] = np.arange(5.) :debt赋值0-4,长度要匹配。
val = Series([-1.2,-1.5,-1.7],index=['two','four','five'])
frame2['debt'] = val : 赋值Series,匹配索引,其他的会填上NaN
给不存在的列赋值会创建列,然后del用于删除列,如下:
In [53]:frame2['eastern']=frame2.state=='Ohio'
In[54]:frame2
0ut[54]:
year state pop debt eastern
one 2000 Ohio 1.5 NaN True
two 2001 Ohio 1.7 -1.2 True
three 2002 Ohio 3.6 NaN True
four 2001 Nevada 2.4 -1.5 False
five 2002 Nevada 2.9 -1.7 False
In [5s]:del framez['eastern']
In [56]:frame2.columns
0ut[56]:Index([year,state,pop,debt],dtype=object)
同样的,通过索引方式返回的列只是相应数据的视图而已,并不是副本。因此,对返回的Series所做的任何就地修改全都会反映到源DataFrame上。通过Series的copy方法即可显式地复制列。
另外一种常见的数据形式是嵌套字典:
In [57]:pop={'Nevada':{2001:2.4,2002:2.9},
'Ohio':{2000:1.5,2001:1.7,2002:3.6}}
如果将它传给DataFrame,它就会被解释为:外层字典的键作为列,内层键则作为行
索引(也可以显示指定索引):
In [58]:frame3=DataFrame(pop)
In [59]:frame3
0ut[59]:
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
然后 你还可以转置:
fram3.T
得到的是:
2000 2001 2002
Nevada NaN 2.4 2.9
Ohio 1.5 1.7 3.6
In[62]:pdata={'ohio':frame3['ohio'][:-1],
Nevada':frame3['Nevada][:2]}
In [63]:DataFrame(pdata)
Out[63]:
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7
类型 | 说明 |
---|---|
二维ndarray | 数据矩阵,还可以传入行标和列标 |
由数组、列表或元组组成的字典 | 每个序列会变成DataFrame的一列。所有序列的长度必须相同 |
NumPy的结构化/记录数组 | 类似于“由数组组成的字典” |
由Series组成的字典 | 每个Series会成为一列。如果没有显式指定索引,则各Series的索引会被合并成结果的行索引 |
由字典组成的字典 | 各内层字典会成为一列。键会被合并成结果的行索引,跟“由Series组成的字典”的情况一样 |
字典或Series的列表 | 各项将会成为DataFrame的一行。字典键或Series索引的并集将会成为DataFrame的列标 |
由列表或元组组成的列表 | 类似于“二维ndarray” |
另一个DataFrame | 该DataFrame的索引将会被沿用,除非显式指定了其他索引 |
NumPy的MaskedArray | 类似于“二维ndarray”的情况,只是掩码值在结果DataFrame会变成NA/缺失值 |
([:-1]代表0到最后一个 但是左闭右开哈)
可以输入给DataFrame的数据(很多都支持。。。)
类型 | 说明 |
---|---|
二维ndarray | 数据矩阵,还可以传入行标和列标 |
由数组、列表或元组组成的字典 | 每个序列会变成DataFrame的一列。所有序列的长度必须相同 |
NumPy的结构化/记录数组 | 类似于“由数组组成的字典” |
由Series组成的字典 | 每个Series会成为一列。如果没有显式指定索引,则各Series的索引会被合并成结果的行索引 |
由字典组成的字典 | 各内层字典会成为一列。键会被合并成结果的行索引,跟“由Series组成的字典”的情况一样 |
字典或Series的列表 | 各项将会成为DataFrame的一行。字典键或Series索引的并集将会成为DataFrame的列标 |
由列表或元组组成的列表 | 类似于“二维ndarray” |
另一个DataFrame | 该DataFrame的索引将会被沿用,除非显式指定了其他索引 |
NumPy的MaskedArray | 类似于“二维ndarray”的情况,只是掩码值在结果DataFrame会变成NA/缺失值 |
也可以直接设置DataFrame的index和columns的name属性,同样frame3.values返回的是二维ndarray的形式。
索引对象
In[68]:obj = Series(range(3),index=['a','b','c'])
In[69]:index = obj.index
In[7o]:index
out[7o]:Index([a,b,c],dtype=object)
In[71]:index[1:]
out[71]:Index([b,c],dtype=object)
#Index对象是不可修改的(immutable),因此用户不能对其进行修改:
In[72]:index[1]='d'#抛出异常
不可修改性非常重要,因为这样才能使Index对象在多个数据结构之间安全共享:
In[73]:index = pd.Index(np.arange(3))
In[74]:obj2 = Series([1.5,-2.5,0],index=index)
In[75]:obj2.index is index
Out[75]:True
类 | 说明 |
---|---|
Index | 最泛化的Index对象,将轴标签表示为一个由Python对象组成的NumPy数组 |
Int64|lndex | 针对整数的特殊Index |
Multilndex | “层次化”索引对象,表示单个轴上的多层索引。可以看做由元组组成的数组 |
Datetimelndex | 存储纳秒级时间戳(用NumPy的datetime64类型表示) |
Periodlndex | 针对Period数据(时间间隔)的特殊Index |
表5-2:pandas中主要的Index对象
类 | 说明 |
---|---|
Index | 最泛化的Index对象,将轴标签表示为一个由Python对象组成的NumPy数组 |
Int64|lndex | 针对整数的特殊Index |
Multilndex | “层次化”索引对象,表示单个轴上的多层索引。可以看做由元组组成的数组 |
Datetimelndex | 存储纳秒级时间戳(用NumPy的datetime64类型表示) |
Periodlndex | 针对Period数据(时间间隔)的特殊Index |
方法 | 说明 |
---|---|
append | 连接另一个Index对象,产生一个新的Index |
diff | 计算差集,并得到一个Index |
intersection | 计算交集 |
union | 计算并集 |
isin | 计算一个指示各值是否都包含在参数集合中的布尔型数组 |
delete | 删除索引i处的元素,并得到新的Index |
drop | 删除传入的值,并得到新的Index |
insert | 将元素插入到索引i处,并得到新的Index |
is_monotonic | 当各元素均大于等于前一个元素时,返回True |
is_unique | 当ndex没有重复值时,返回True |
unique | 计算ndex中唯一值的数组 |
表5-3:Index的方法和属性
方法 | 说明 |
---|---|
append | 连接另一个Index对象,产生一个新的Index |
diff | 计算差集,并得到一个Index |
intersection | 计算交集 |
union | 计算并集 |
isin | 计算一个指示各值是否都包含在参数集合中的布尔型数组 |
delete | 删除索引i处的元素,并得到新的Index |
drop | 删除传入的值,并得到新的Index |
insert | 将元素插入到索引i处,并得到新的Index |
is_monotonic | 当各元素均大于等于前一个元素时,返回True |
is_unique | 当ndex没有重复值时,返回True |
unique | 计算ndex中唯一值的数组 |
总结:主要讲的是pandas的数据结构(Series和DataFrame),感觉DataFrame就是二维的Series,很多方法和理解都是相通的。DataFrame在之后的使用过程中应该会非常频繁的使用到。
个人微信公众号:BrainZou