内容简介
很早就开始接触python的pandas库,但是没有系统的学习过,只是在网上找些碎片来学习,因此很多东西都是半知半解,用起来也是糊里糊涂,很开心能有一段完整的时间来系统的学习python以及pandas库,以后处理数据也能得心应手~
pandas是一个强大的工具,他有两种主要的数据结构:Series和DataFrame,还有一些基于这两种结构的基本功能,以及汇总和统计功能,接下来会分4篇博客来详细的介绍pandas的使用。这4篇博客的主题为:
1)Series和DataFrame介绍和构建
2)Series和DataFrame的索引、切片、过滤,算术运算与数据对齐,函数映射,排序等
3)Series和DataFrame的汇总和计算统计描述
4)Series和DataFrame的层次化索引
本篇博客主要内容:
1)Series构建
2)DataFrame构建
3)索引属性
Series
Series = 一维数组 + 数据标签(索引)
Series创建
import pandas as pd
from pandas import Series,DataFrame
Series()输入可以是列表,可以是数组(各种numpy数据类型),当不指定索引时,系统自动加上0-(N-1)的整数索引(N为数组大小),还可以是字典类型,字典的键会被当成索引,字典的值会被当做Series的值。
#列表构建Series
obj1 = Series([1,2,3,4])
obj1
0 1
1 2
2 3
3 4
dtype: int64
#字典创建Series
stata = {'a':10,'b':20,'c':30,'d':40}
obj2 = Series(stata)
obj2
a 10
b 20
c 30
d 40
dtype: int64
import numpy as np
#自定义索引
obj3 = Series(np.arange(4),index=['aa','bb','cc','dd'])
obj3
aa 0
bb 1
cc 2
dd 3
dtype: int32
obj1
0 1
1 2
2 3
3 4
dtype: int64
#注意利用Series构建数组时,index不能指定,可以通过先复制,在改变index实现修改原Series的索引
obj4 = Series(obj1,index=['aa','bb','cc','dd'])
obj4
aa NaN
bb NaN
cc NaN
dd NaN
dtype: float64
Series 访问
1)通过索引访问包括索引切片
2)通过逻辑运算访问
3)通过.values和.index访问
obj1
0 1
1 2
2 3
3 4
dtype: int64
obj1[0]
1
obj1[1:3]
1 2
2 3
dtype: int64
obj1.values
array([1, 2, 3, 4], dtype=int64)
obj1.index
RangeIndex(start=0, stop=4, step=1)
obj1[obj1>2]#逻辑表达式
2 3
3 4
dtype: int64
Series 方法和属性以及修改
方法:isnull、notnull等
obj2
a 10
b 20
c 30
d 40
dtype: int64
obj2['e'] = np.nan
obj2
a 10.0
b 20.0
c 30.0
d 40.0
e NaN
dtype: float64
obj2.isnull()
a False
b False
c False
d False
e True
dtype: bool
obj2.notnull()
a True
b True
c True
d True
e False
dtype: bool
属性:.values,.index,.name,.indes.name
obj2
a 10.0
b 20.0
c 30.0
d 40.0
e NaN
dtype: float64
obj2.name = 'dict'
obj2.index.name = 'abcde'
obj2.name
'dict'
obj2.index.name
'abcde'
修改:包括values和index的修改
#vakues修改
obj3
aa 0
bb 1
cc 2
dd 3
dtype: int32
obj3['aa']=5
obj3
aa 5
bb 1
cc 2
dd 3
dtype: int32
obj3[1:3]=7
obj3
aa 5
bb 7
cc 7
dd 3
dtype: int32
obj3.index = ['one','two','three','four']
obj3
one 5
two 7
three 7
four 3
dtype: int32
Series小结
1)列表、字典、数组等都可以转化为Series,但是Series只能复制
2)Series可以进行索引、切片访问他的values
3)Series有.values,.index,.name,.indexname属性,还要isnull,notnull等实例方法
4)Series的.name,.index.name可以通过直接赋值进行修改,.values可以过索引、切片进行修改
DataFrame
DataFrame是一个表格型的数据结构,是以一个或多个二维块存放的数据表格(层次化索引),DataFrame既有行索引还有列索引,它有一组有序的列,每列既可以是不同类型(数值、字符串、布尔型)的数据,或者可以看做有Series组成的字典。
可以输入给DataFrame构造器的数据
类型 | 说明 |
---|---|
二维ndarray | 数据矩阵,还可以传入行标和列标 |
由数组、列表或元组组成的字典 | 每个序列会变成DataFrame的一列,所有序列的长度必须相同 |
Numpy的结构化/记录数组 | 类似于“又数组组成的字典” |
由Series组成的字典 | 每个Series会成为一列,如果没有显示指定索引,则个Series的索引会被合并(考虑到数字对齐的情况)成结果的行索引 |
由字典组成的字典 | 各内层字典会成为一列,每个字典的键会被合并成结果的行索引 |
字典或Series的列表 | 各项将会成为DataFrame的一行,字典键或series索引的并集将会成为DataFrame的列表 |
由列表或元组组成的列表 | 类似于“二维ndarray” |
另一个DataFrame | 该DataFrame的索引将会被沿用,除非显式指定了其他索引 |
Numpy的MaskedArray | 类似于“二维ndarray”的情况,只是掩码值在结果DataFrame会变成NA/缺失值 |
DataFrame 创建
#字典
dictionary = {'state':['0hio','0hio','0hio','Nevada','Nevada'],
'year':[2000,2001,2002,2001,2002],
'pop':[1.5,1.7,3.6,2.4,2.9]}
frame = DataFrame(dictionary)
frame
pop | state | year | |
---|---|---|---|
0 | 1.5 | 0hio | 2000 |
1 | 1.7 | 0hio | 2001 |
2 | 3.6 | 0hio | 2002 |
3 | 2.4 | Nevada | 2001 |
4 | 2.9 | Nevada | 2002 |
#添加修改
frame['add']=[0,0,0,0,0]
frame
pop | state | year | add | |
---|---|---|---|---|
0 | 1.5 | 0hio | 2000 | 0 |
1 | 1.7 | 0hio | 2001 | 0 |
2 | 3.6 | 0hio | 2002 | 0 |
3 | 2.4 | Nevada | 2001 | 0 |
4 | 2.9 | Nevada | 2002 | 0 |
#让我们看一下数字对齐
value = Series([1,2,3,4,5,6],index = [0,1,2,3,4,5])
frame['add1'] = value
frame#多的被切掉
pop | state | year | add | add1 | |
---|---|---|---|---|---|
0 | 1.5 | 0hio | 2000 | 0 | 1 |
1 | 1.7 | 0hio | 2001 | 0 | 2 |
2 | 3.6 | 0hio | 2002 | 0 | 3 |
3 | 2.4 | Nevada | 2001 | 0 | 4 |
4 | 2.9 | Nevada | 2002 | 0 | 5 |
value1 = Series([10,12,13],index = [0,1,2])
frame['add2'] = value1
frame#少的被填上nan
pop | state | year | add | add1 | add2 | |
---|---|---|---|---|---|---|
0 | 1.5 | 0hio | 2000 | 0 | 1 | 10.0 |
1 | 1.7 | 0hio | 2001 | 0 | 2 | 12.0 |
2 | 3.6 | 0hio | 2002 | 0 | 3 | 13.0 |
3 | 2.4 | Nevada | 2001 | 0 | 4 | NaN |
4 | 2.9 | Nevada | 2002 | 0 | 5 | NaN |
DataFrame 切片和索引
#看一下索引和切片
frame.index = ['one','two','three','four','five']
frame
pop | state | year | add | add1 | add2 | |
---|---|---|---|---|---|---|
one | 1.5 | 0hio | 2000 | 0 | 1 | 10.0 |
two | 1.7 | 0hio | 2001 | 0 | 2 | 12.0 |
three | 3.6 | 0hio | 2002 | 0 | 3 | 13.0 |
four | 2.4 | Nevada | 2001 | 0 | 4 | NaN |
five | 2.9 | Nevada | 2002 | 0 | 5 | NaN |
frame['two']#不能对行进行关键字索引?
KeyError Traceback (most recent call last)
<ipython-input-48-8e914d5f8357> in <module>()
----> 1 frame['two']
C:\Program Files\anaconda\lib\site-packages\pandas\core\frame.pyc in __getitem__(self, key)
1995 return self._getitem_multilevel(key)
1996 else:
-> 1997 return self._getitem_column(key)
1998
1999 def _getitem_column(self, key):
C:\Program Files\anaconda\lib\site-packages\pandas\core\frame.pyc in _getitem_column(self, key)
2002 # get column
2003 if self.columns.is_unique:
-> 2004 return self._get_item_cache(key)
2005
2006 # duplicate columns & possible reduce dimensionality
C:\Program Files\anaconda\lib\site-packages\pandas\core\generic.pyc in _get_item_cache(self, item)
1348 res = cache.get(item)
1349 if res is None:
-> 1350 values = self._data.get(item)
1351 res = self._box_item_values(item, values)
1352 cache[item] = res
C:\Program Files\anaconda\lib\site-packages\pandas\core\internals.pyc in get(self, item, fastpath)
3288
3289 if not isnull(item):
-> 3290 loc = self.items.get_loc(item)
3291 else:
3292 indexer = np.arange(len(self.items))[isnull(self.items)]
C:\Program Files\anaconda\lib\site-packages\pandas\indexes\base.pyc in get_loc(self, key, method, tolerance)
1945 return self._engine.get_loc(key)
1946 except KeyError:
-> 1947 return self._engine.get_loc(self._maybe_cast_indexer(key))
1948
1949 indexer = self.get_indexer([key], method=method, tolerance=tolerance)
pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:4154)()
pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:4018)()
pandas\hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:12368)()
pandas\hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:12322)()
KeyError: 'two'
frame['add']
one 0 two 0 three 0 four 0 five 0 Name: add, dtype: int64
frame[2:4]
pop | state | year | add | add1 | add2 | |
---|---|---|---|---|---|---|
three | 3.6 | 0hio | 2002 | 0 | 3 | 13.0 |
four | 2.4 | Nevada | 2001 | 0 | 4 | NaN |
frame.ix['three']#行可以通过索引字段.ix进行获取
pop 3.6
state 0hio
year 2002
add 0
add1 3
add2 13
Name: three, dtype: object
DataFrame 的方法和属性
frame.name = 'objDataFrame'
frame.name
'objDataFrame'
frame.index
Index([u'one', u'two', u'three', u'four', u'five'], dtype='object')
frame.index.name='frameIndex'
frame.index.name
'frameIndex'
frame.values
array([[1.5, '0hio', 2000L, 0L, 1L, 10.0],
[1.7, '0hio', 2001L, 0L, 2L, 12.0],
[3.6, '0hio', 2002L, 0L, 3L, 13.0],
[2.4, 'Nevada', 2001L, 0L, 4L, nan],
[2.9, 'Nevada', 2002L, 0L, 5L, nan]], dtype=object)
frame.columns
Index([u'pop', u'state', u'year', u'add', u'add1', u'add2'], dtype='object')
frame.add#这种方法最好还是不要用了
<bound method DataFrame.add of pop state year add add1 add2
frameIndex
one 1.5 0hio 2000 0 1 10.0
two 1.7 0hio 2001 0 2 12.0
three 3.6 0hio 2002 0 3 13.0
four 2.4 Nevada 2001 0 4 NaN
five 2.9 Nevada 2002 0 5 NaN>
frame[2:4]
pop | state | year | add | add1 | add2 | |
---|---|---|---|---|---|---|
frameIndex | ||||||
three | 3.6 | 0hio | 2002 | 0 | 3 | 13.0 |
four | 2.4 | Nevada | 2001 | 0 | 4 | NaN |
DataFrame小结
1)注意,DataFrame的数字对齐
2)可以使用列的关键字来索引,行索引需使用索引字段.ix[],可以直接使用切片
3)DataFrame的几个属性.values,.index,.name,.index.name,.columns
索引对象
pandas的索引对象负责管理周标签和其他原数据(比如轴名称等),构建Series和DataFrame时,所用的任何数组或其他序列的标签都会被转化成一个Index。
obj2
abcde
a 10.0
b 20.0
c 30.0
d 40.0
e NaN
Name: dict, dtype: float64
indexObj2 = obj2.index
indexObj2
Index([u'a', u'b', u'c', u'd', u'e'], dtype='object', name=u'abcde')
indexObj2[2:5]
Index([u'c', u'd', u'e'], dtype='object', name=u'abcde')
indexObj2[1]='FF'#不可修改性,但是可以在构建Series或DataFrame时自定义index
TypeError Traceback (most recent call last)
<ipython-input-71-ef293763f5e1> in <module>()
----> 1 indexObj2[1]='FF'
C:\Program Files\anaconda\lib\site-packages\pandas\indexes\base.pyc in __setitem__(self, key, value)
1243
1244 def __setitem__(self, key, value):
-> 1245 raise TypeError("Index does not support mutable operations")
1246
1247 def __getitem__(self, key):
TypeError: Index does not support mutable operations
frame
pop | state | year | add | add1 | add2 | |
---|---|---|---|---|---|---|
frameIndex | ||||||
one | 1.5 | 0hio | 2000 | 0 | 1 | 10.0 |
two | 1.7 | 0hio | 2001 | 0 | 2 | 12.0 |
three | 3.6 | 0hio | 2002 | 0 | 3 | 13.0 |
four | 2.4 | Nevada | 2001 | 0 | 4 | NaN |
five | 2.9 | Nevada | 2002 | 0 | 5 | NaN |
'add' in frame.columns
True
'one' in frame.index
True
index1 = obj1.index
index1
RangeIndex(start=0, stop=4, step=1)
index2 = obj3.index
index2
Index([u'one', u'two', u'three', u'four'], dtype='object')
index1.append(index2)
Index([0, 1, 2, 3, u'one', u'two', u'three', u'four'], dtype='object')
index2 = [2,4,6,8]
index1.diff(index2)
C:\Program Files\anaconda\lib\site-packages\ipykernel\__main__.py:1: FutureWarning: diff is deprecated. Use difference instead
if __name__ == '__main__':
Int64Index([0, 1, 3], dtype='int64')
index1.isin(index2)
array([False, False, True, False], dtype=bool)
index1.unique
<bound method RangeIndex.unique of RangeIndex(start=0, stop=4, step=1)>
pandas 中主要的index对象
类 | 说明 |
---|---|
Index | 最返回的Index对象,将轴标签表示为一个由python对象组成的numpy数组 |
Int64Index | 针对整数的特殊Index |
MultiIndex | “层次化”索引对象,表示单个轴上的多层索引,可以看做由元组组成的数组 |
DatetimeIndex | 存储纳秒级时间戳(用numpy的datetime64类型表示) |
PeriodIndex | 针对Period数据(时间间隔)的特殊Index |
Index的方法和属性
方法 | 说明 |
---|---|
append | 链接另一个Index对象,产生一个新的Index |
diff | 计算差集,并得到一个Index |
intersection | 计算交集 |
union | 计算并集 |
isin | 计算一个指示该Index各值是否都包含在参数集合中的布尔型数组 |
delete | 删除索引i处的元素,并得到新的Index |
drop | 删除传入的值,并得到新的Index |
insert | 将元素插入到索引i处,并得到新的Index |
is_monotonic | 当各元素均大于等于前一个元素时,返回true |
is_unique | 当Index没有重复值时,返回True |
unique | 计算Index中唯一值的数组 |