Python可以做的那些事!程序员码农的世界

利用Python进行数据分析(五)之pandas入门

2017-12-09  本文已影响76人  BrainZou

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

上一篇下一篇

猜你喜欢

热点阅读