python-pandas-Series和DataFrame数据结构构建

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LY_ysys629/article/details/73695242

内容简介

很早就开始接触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中唯一值的数组

猜你喜欢

转载自blog.csdn.net/LY_ysys629/article/details/73695242