您的位置:首页 > 编程语言 > Python开发

利用python进行数据分析-pandas入门

2016-06-07 14:01 876 查看
1.pandas的数据结构介绍

a.Series

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

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

print obj

结果为:

0    4

1    7

2   -5

3    3

dtype: int64

可以通过Series的values和index属性获取其数组表示形式和索引对象

print obj.values

print obj.index

结果为:

[ 4  7 -5  3]

Int64Index([0, 1, 2, 3], dtype='int64')

通常,我们希望所创建的Series带有一个可以对各个数据点进行标记的索引:

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

print obj2

结果为:

d    4

b    7

a   -5

c    3

dtype: int64

与普通Numpy数组相比,你可以通过索引的方式选取Series中的单个或一组值

print obj2['d']

obj2['c']=10

print obj2[['a','c']]

结果为:

4

a    -5

c    10

dtype: int64

numpy数组运算都会保留索引和值之间的链接

print obj2[obj2>0]

print obj2*2

结果为:

d     4

b     7

c    10

dtype: int64

d     8

b    14

a   -10

c    20

dtype: int64

还可以将Series看成是一个定长的有序字典,因为它是索引值到数据值的一个映射

print 'b' in obj2

print 'e' in obj2

结果为:

True

False

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

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

obj3=Series(sdata)

print obj3

结果为:

Ohio      35000

Oregon    16000

Texas     71000

Utah       5000

dtype: int64

如果传入一个字典,则结果Series中的索引就是原字典的键(有序排序)

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

obj4=Series(sdata,index=states)

print obj4

结果为:

California      NaN

Ohio          35000

Oregon        16000

Texas         71000

dtype: float64

pandas的isnull和notnull的函数可用于检测缺失数据

print pd.isnull(obj4)

print pd.notnull(obj4)

结果为:

California     True

Ohio          False

Oregon        False

Texas         False

dtype: bool

California    False

Ohio           True

Oregon         True

Texas          True

dtype: bool

Series也有类似的实例方法

print obj4.isnull()

结果为:

California     True

Ohio          False

Oregon        False

Texas         False

dtype: bool

对于许多应用而言,Series最重要的一个功能:它在算术运算中会自动对齐不同索引的数据

print obj3

print obj4

print obj3+obj4

结果为:

Ohio      35000

Oregon    16000

Texas     71000

Utah       5000

dtype: int64

California      NaN

Ohio          35000

Oregon        16000

Texas         71000

dtype: float64

California       NaN

Ohio           70000

Oregon         32000

Texas         142000

Utah             NaN

dtype: float64

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

obj4.name='population'

obj4.index.name='state'

print obj4

结果为:

state

California      NaN

Ohio          35000

Oregon        16000

Texas         71000

Name: population, dtype: float64

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

obj.index=['zhuheng','xiaoyang','heng','zhu']

print obj

结果为:

zhuheng     4

xiaoyang    7

heng       -5

zhu         3

dtype: int64

2.DataFrame

DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型。DataFrame既有行索引也有列索引,它可以看做由Series组成的字典(共用同一个索引)

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)

print 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的列就会按照指定顺序进行排列

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

结果为:

   year   state  pop

0  2000    Ohio  1.5

1  2001    Ohio  1.7

2  2002    Ohio  3.6

3  2001  Nevada  2.4

4  2002  Nevada  2.9

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

frame2=DataFrame(data,columns=['year','state','pop','debt'],

                 index=['one','two','three','four','five'])

print 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

print frame2['year']

print frame2.state

结果为:

one      2000

two      2001

three    2002

four     2001

five     2002

Name: year, dtype: int64

one        Ohio

two        Ohio

three      Ohio

four     Nevada

five     Nevada

Name: state, dtype: object

注意,返回的Series拥有原DataFrame相同的索引,且其name属性也已经相应的设置好了。行也可以通过位置或名称的方式进行获取,比如用索引字段ix

print frame2.ix['three']

结果为:

year     2002

state    Ohio

pop       3.6

debt      NaN

Name: three, dtype: object

列可以通过赋值的方式进行修改

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

print 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

如果赋值的是一个Series,就会精确匹配DataFrame的索引,所有的空位都将被填上缺失值

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

frame2['debt']=val

print 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'

print frame2

del frame2['eastern']

结果为:

       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

另一种常见的数据形式是嵌套字典

pop={'Nevada':{2001:2.4,2002:2.9},

     'Ohio':{2000:1.5,2001:1.7,2002:3.6}}

frame3=DataFrame(pop)

print frame3

结果为:

      Nevada  Ohio

2000     NaN   1.5

2001     2.4   1.7

2002     2.9   3.6

可以对该结果进行转置

print frame3.T

结果为:

        2000  2001  2002

Nevada   NaN   2.4   2.9

Ohio     1.5   1.7   3.6

内层字典的键会被合并、排序以形成最终的索引。如果显式指定了索引,则不会这样

print DataFrame(pop,index=[2001,2002,2003])

结果为:

      Nevada  Ohio

2001     2.4   1.7

2002     2.9   3.6

2003     NaN   NaN

由Series组成的字典差不多也是一样的用法

pdata={'Ohio':frame3['Ohio'][:-1],

       'Nevada':frame3['Nevada'][:2]}

print DataFrame(pdata)

结果为:

      Nevada  Ohio

2000     NaN   1.5

2001     2.4   1.7



如果设置了DataFrame的index和columns的name属性,则这些信息也会被显式出来

frame3.index.name='year'

frame3.columns.name='state'

print frame3

结果为:

state  Nevada  Ohio

year               

2000      NaN   1.5

2001      2.4   1.7

2002      2.9   3.6

跟Series一样,values属性也会以二维ndarray的形式返回DataFrame中的数据

print frame3.values

结果为:

[[ nan  1.5]

 [ 2.4  1.7]

 [ 2.9  3.6]]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 数据分析 pandas