您的位置:首页 > 理论基础 > 数据结构算法

python:pandas(1),数据结构介绍

2017-09-11 23:50 363 查看

利用python进行数据分析

第五章:pandas入门

第一节,pandas的数据结构介绍

>>> from pandas import Series, DataFrame


>>> import pandas as pd


这两个模块导入是前提

1,Series

Series是一种类似于一维数组的对象,他由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。

>>> obj=Series([4, 7, -5, 3])


>>> obj


0 4


1 7


2 -5


3 3


Series的字符串表现形式为:索引在左边,值在右边。如果没定义索引,则索引的表现形式类似于列表的元素索引,从0到len(list)-1;但可以通过Series的values和index属性获取其数组表现形式的索引和对象:

>>> obj.values
#获取值

array([4, 7, -5, 3])


>>> obj.index
#获取索引

Int64Index([0 ,1, 2, 3])


标记索引

>>> obj2=Series([4, 7, -5, 3]), index=['d', 'b', 'a', 'c']


>>> obj2


d 4


b 7


a -5


c 3


>>> obj2.index


>>> Index([d, b, a, c], dtype=object)


可以通过索引的方式选取Series中的单个或一组值

>>> obj2['a']


-5


>>> obj2['d']=6
#可以对某个索引对应的值进行赋值

>>> obj2(['c', 'a', 'd'])


c 3


a -5


d 6


>>> obj2[obj2 > 0]
#显示obj2中大于3的值,及其索引

>>> obj2*2
#将obj2中的每个值都乘2,并输出结果

实际上可以将Series看成一个定长的有序字典

>>> 'b' in obj2


如果数据存放在一个字典中,也可以直接通过字典来创建Series:

>>> sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}


>>> obj3 = Series(sdata)


Ohio 35000


Oregon 16000


Texas 71000


Utah 5000


如果原有Series中索引就是原有字典的键,而且是一个有序排列的列表,则Series中是数据可以按照列表要求进行排列

>>> states = ['California', 'Ohio', 'Oregon', 'Texas']


>>> obj4 = Series(sdata, index=states)


>>> obj4
#是否按照要求排序需要验证一下

California NaN


Ohio 35000


Oregon 16000


Texas 71000


‘California’这个索引对应的值找不到,所以结果为NaN(即“非数字”not a number,在pandas中,用于表示缺失或NA值),pandas中的isnull能够检验数据中是否存在缺失值,存在的缺失值显示True,不存在的确实值显示False,同理,notnull检验是否是非缺失值,存在的缺失值显示False,不存在的确实值显示True;

>>> pd.isnull(obj4)


California True


Ohio False


Oregon False


Texas False


>>> pd.notnull(obj4)


California False


Ohio True


Oregon True


Texas True


>>> obj4.isnull()


California True


Ohio False


Oregon False


Texas False


Series最重要的一个功能是:它在算术运算中会自动对齐不同索引的数据。

>>> obj3


Ohio 35000


Oregon 16000


Texas 71000


Utah 5000


>>> obj4


California NaN


Ohio 35000


Oregon 16000


Texas 71000


>>> obj3+obj4


California NaN


Ohio 70000


Oregon 32000


Texas 142000


Utah NaN


只有两个Series对象中都共同存在的索引对应的值才会进行运算,而没有共同存在的所以则显示其值为NaN

Series对象本身及其索引都有一个name属性,该属性跟pandas其他的关键功能关系非常密切

>>> obj4.name = 'population'


>>> obj4.index.name = 'state'


>>> obj4


state


California NaN


Ohio 35000


Oregon 16000


Texas 71000


Name: population


Series的索引可以通过赋值的方式就地修改

>>> obj.index=['Bob', 'Steve', 'Jeff', 'Ryan']


>>> obj


Bob 4


Steve 7


Jeff -5


Ryan 3


2,DataFrame

DataFrame是一种表格行的数据结构,常作为一个二维结构保存数据,他既有行索引也有列索引

他可以通过一种传入字典的方式,形成一个有序排列的矩阵

>>> 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)


加上索引之后数据结果会有序排列

>>> frame


··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


如果指定了序列的列,则DataFrame的列就会按照指定顺序进行排列

>>> DataFrame(data, columns=['year', 'state', 'pop'])


则横向的行就会按照year,state,pop这样的方式排列而纵向的排列方式不变

如果传入的列在数据中找不到,就会产生NA值

>>> frame2=DataFrame(data, columns=['year', 'state', 'pop', 'debt'], index=['one', 'two', 'three', 'four', 'five'])


>>> frame2


····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


通过类似字典标记的方式或属性方式,可以将DataFrame的列获取为一个Series

>>> frame2['state']


>>> frame2.state


one Ohio


two Ohio


three Ohio


four Nevada


five Nevada


Name: state


DataFrame的行也可以通过位置或名称的方式进行获取,比如用索引字段ix

>>> frame2.ix['three']


year 2002


state Ohio


pop 3.6


debt NaN


Name: three


列可以通过赋值方式进行修改,可以给空的“debt”列赋值一个标量值,或一组值:

>>> frame2['debt']=16.5


>>> frame2


····year state pop debt


one 2000 Ohio 1.5 16.5


two 2001 Ohio 1.7 16.5


three 2002 Ohio 3.6 16.5


four 2001 Nevada 2.4 16.5


five 2002 Nevada 2.9 16.5


也可对某一列进行迭代赋值

>>>frame2['debt']=np.arange(5.)


>>> frame2


····year state pop debt


one 2000 Ohio 1.5 0


two 2001 Ohio 1.7 1


three 2002 Ohio 3.6 2


four 2001 Nevada 2.4 3


five 2002 Nevada 2.9 4


将列表或数组赋值给某个列时,其长度必须和DataFrame的长度相匹配,如果赋值的是一个Series,就会精确匹配DataFrame的索引,所有的空位都被填上缺失值

>>> val = Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])


>>> frame2['debt']=val


>>> frame2


····year state pop debt


one 2000 Ohio 1.5 NaN


two 2001 Ohio 1.7 -1.2


three 2002 Ohio 3.6 NaN


four 2001 Nevada 2.4 -1.5


five 2002 Nevada 2.9 -1.7


为不存在的列赋值会创建出一个新列,del用于删除列

>>> frame2['eastern'] = frame2.state == 'Ohio'
#如果“state”这一列为‘Ohio’则“eastern”这一列显示的是True

>>> frame2['eastern'] = frame2.state == 'Ohio'


>>> frame2


····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


>>> del frame2['eastern']
#删除“eastern”这列数据

>>> frame2.columns


Index([year, state, pop, debt], dtype=object)
#输出列标

>>> frame2.T
#DataFrame的转置

DataFrame构造函数所接受的数据类型

| 类型 | 说明 |

| 二维nadarray | 数据矩阵,还可以传入行标和列标 |

| 由数组、列表或元组组成的字典 | 每个序列会变成DataFrame的一列。所有序列的长度必须相同

| NumPy的结构化/记录数组 | 类似于“由数组组成的字典”|

| 由Series组成的字典 | 每个Series会成为一列。如果没有显示指定索引,则各Series的索引会被合并成结果的行索引 |

| 由字典组成的字典 | 各内层字典会成为一列。键会被合并成结果的行索引,与“由Series组成的字典”的情况一样 |

| 字典或Series的列表 | 各项将会成为DataFrame的一行。字典键或Series索引的并集将会成为DataFrame的列标 |

| 由列表或元组组成的列表另一个DataFrame | 类似于“二维ndarray”|

| 另一个DataFrame | 该DataFrame的索引将会被沿用,除非显示指定了其他索引 |

| NumPy的MaskedArray | 类似于“二维ndarray”的情况,只是掩码值在结果DataFrame会变为NA/缺失值 |

>>> frame3.index.name='year'


>>> frame3.columns.name='state'


>>> frame3


state Nevada Ohio


year


2000 NaN 1.5


2001 2.4 1.7


2002 2.9 3.6


3,索引对象

pandas的索引对象负责管理轴标签和其他元数据(比如轴名称等),构建Series和DataFrame时,所用到的任何数组或其他序列的标签都会被转换成一个Index

>>> obj=Series(range(3), index=['a', 'b', 'c'])


a 0


b 1


c 2


>>> obj.index


Index(['a', 'b', 'c'], dtype=object)


>>> obj.index[1:]


Index(['b', 'c'], dtype=object)


Index对象是不可修改的

>>> index[1]='d'


Error


所以Index对象在多个数据结构之间可共享

index=pd.index(np.arange(3))


obj2=Series([1.5, -2.5, 0], index=index)


0 1.5


1 -2.5


2 0


pandas中主要的Index对象

| 类 | 说明 |

| Index | 最泛化的Index对象,将轴标签表示为一个由Python对象组成的Numpy数组 |

>>> frame3


state Nevada Ohio


year


2000 NaN 1.5


2001 2.4 1.7


2002 2.9 3.6


>>> 'Ohio' in frame3.columes


True


>>> 2000 in frame3.index


False


Index的方法和属性

| 方法 | 说明 |

| append | 连接另一个Index对象,产生一个新的Index |

| diff | 计算差集,并得到一个Index |

| intersection | 计算交集 |

| union | 计算并集 |

| isin | 计算一个指示各值是否都包含在参数集合中的布尔型数值 |

| delete | 删除索引i处的元素,并得到新的Index |

| drop | 删除传入的值,并得到新的Index |

| insert | 将元素插入到索引i处,并得到新的Index |

| is_monotonic | 当各元素均大于等于前一个元素时,返回True |

| is_unique | 当Index没有重复值时,返回True |

| unique | 计算Index中唯一值的数组 |
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: