python之pandas⽤法详解
pandas是基于numpy构建的,使得数据分析⼯作变得更快更简单的⾼级数据结构和操作⼯具。
⼀、pandas数据结构
两个主要的数据结构:Series和DataFrame。
1.1 Series
Series是⼀种类似于⼀维数组的对象,它由⼀维数组(各种numpy数据类型)以及⼀组与之相关的数据标签(即索引)组成,仅由⼀组数据即可产⽣最简单的Series.
Series的字符串表现形式为:索引在左边,值在右边。如果没有为数据指定索引,于是会⾃动创建⼀个0到N-1(N为数据的长度)的整数型索引。可以通过Series的values和index属性获取其数组表现形式和索引对象:
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
#**********************************Series*************************************
obj=Series([2,4,7,8,9,3])
isnull的用法"""obj=
0    2
1    4
2    7
3    8
4    9
5    3
dtype: int64
"""
obj.values    #return:array([2, 4, 7, 8, 9, 3], dtype=int64)
obj.index    #return: RangeIndex(start=0, stop=6, step=1)
#创建对数据点进⾏标记的索引
obj2=Series([2,4,7,8,9,3],index=['a','b','c','d','e','f'])
"""obj2=
a    2
b    4
c    7
d    8
e    9
f    3
dtype: int64
"""
obj2.index  #return:Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')
#利⽤索引的⽅式选取Series的单个或⼀组值
obj2['c']  #return:7
obj2[['a','c','f']]
"""out:
a    2
c    7
f    3
dtype: int64
"""
#numpy数组运算(布尔型数组进⾏过滤、标量乘法、应⽤数学函数等)都会保留索引和值之间的链接
obj2[obj2>5]
obj2*2
"""
obj2[obj2>5]:      obj2*2:      np.exp(obj2):
c    7            a    4          a      7.389056
d    8            b    8          b      54.598150
e    18          e    8103.083928
f    6          f      20.085537
dtype: int64      dtype: float64
"""
#可以将Series看成是⼀个有定长的有序字典,因为它是索引值到数据值的⼀个映射
#因此,⼀些字典函数也可以在这⾥使⽤:
'a' in obj2        #return:True
'h' in obj2        #return:False
2 in obj2.values  #return:True
#利⽤字典创建Series
dic={'l':1,'z':2,'h':3}
obj3=Series(dic)
"""obj3=
h    3
l    1
z    2
dtype: int64
"""
#若索引⽐字典的索引多,则与字典索引相匹配的则会被到,并放置到相应的位置中
#⽽对应字不到的索引,其结果则为NaN(即⾮数字,Not a Number,在pandas中,⽤于表⽰缺失或NA值) ind=['l','z','h','a']
obj4=Series(dic,index=ind)
"""obj4=
l    1.0
z    2.0
h    3.0
a    NaN
dtype: float64
"""
#pandas中isnull和notnull函数⽤于检测缺失数据:
pd.isnull(obj4)    #等效于: obj4.isnull()
"""
pd.isnull(obj4):        pd.notnull(obj4)
l    False              l    True
z    False              z    True
h    False              h    True
a    True              a    False
dtype: bool            dtype: bool
"""
#算术运算中⾃动对齐不同索引的数据
obj3+obj4
"""out:
a    NaN
h    6.0
l    2.0
z    4.0
dtype: float64
"""
#Series对象本⾝及其索引都有⼀个name属性
obj4.name='myname'
obj4.index.name='letter'
"""obj4=
letter
l    1.0
z    2.0
h    3.0
a    NaN
Name: myname, dtype: float64
"""
#索引可以通过赋值的⽅式进⾏改变
obj4.index=['li','zi','hua','a']
zi    2.0
hua    3.0
a      NaN
Name: myname, dtype: float64
"""
1.2 DataFrame
DataFrame是⼀个表格型的数据结构,它含有⼀组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有⾏索引也有列索引,它可以被看做由Series组成的字典(公⽤同⼀个索引)。跟其他类似的数据结构相⽐,DataFrame中⾯向⾏和⾯向列的操作基本是平衡的。其实,DataFrame中的数据是以⼀个或多个⼆维块存放的(⽽不是列表、字典或者别的⼀维数据结构)。
其中,可以输⼊给DataFrame构造器的数据类型及相关说明:
#*******************************DataFrame*************************************
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
#构建DataFrame
#最常⽤的⼀种是直接传⼊⼀个由等长列表或numpy数组组成的字典:
data={'names':['Bob','Jane','Jack','Ann'],
'sex':['M','F','M','F'],
'age':[21,30,26,28]}
frame=DataFrame(data)
"""没有指定索引,会⾃动加上索引,且全部列会被有序排列
frame=
age names sex
0  21  Bob  M
1  30  Jane  F
2  26  Jack  M
3  28  Ann  F
"""
#若指定列序列,则会按照指定顺序排列
frame=DataFrame(data,columns=['names','sex','age'])
"""frame=
names sex  age
0  Bob  M  21
1  Jane  F  30
"""
#若传⼊列在数据中不到,会返回NA值
frame1=DataFrame(data,columns=['names','sex','age','id'],index=['a','b','c','d']) """frame1=
names sex  age  id
a  Bo
b  M  21  NaN
b  Jane  F  30  NaN
c  Jack  M  26  NaN
d  Ann  F  28  NaN
"""
#通过类似字典标记或属性的⽅式,可以获取Series(列数据):
frame1['sex']
frame1.age
"""
frame1['sex']:                          frame1.age:
a    M                                    a      21
b    F                                    b      30
c    M                                    c      26
d    F                                    d      28
Name: sex, dtype: object                  Name: age, dtype: int64
"""
#⾏也可以通过位置或名称获取
#ix VS loc VS iloc
#loc——通过⾏标签索引⾏数据
frame1.loc('c')
#等效于
#iloc——通过⾏号获取⾏数据
frame1.iloc[2]
#ix--以上两种的混合,既可以⽤⾏号,也可以⽤⾏标签
frame1.ix[2]
frame1.ix['c']
"""result:
names    Jack
sex        M
age        26
id        NaN
Name: c, dtype: object
"""
#获取多⾏
#注意:使⽤⾏标签时,:两边是全包括,使⽤⾏号时是左闭右开
frame1.loc['b':'c']
frame1.iloc[2:4]
frame1.ix['b':'c']
frame1.ix[2:4]
"""result:
names sex  age  id
c  Jack  M  26  NaN
d  Ann  F  28  NaN
"""
#利⽤ix、loc、iloc拓展获取列数据
#获取单列,如下所⽰,或将['sex']写成'sex',将不显⽰columns名
frame1.ix[:,['sex']]  #等效于frame1['sex']
frame1.loc[:,['sex']]
frame1.ix[:,[1]]
"""
frame1.ix[:,['sex']]:      VS      frame1.ix[:,'sex'] :
sex
a  M                              a    M
b  F                              b    F
c  M                              c    M
d  F                              d    F
"""
#获取多列
frame1.iloc[:,1:4]
"""result:
sex  age  id
a  M  21  NaN
b  F  30  NaN
c  M  26  NaN
d  F  28  NaN
"""
#给列赋值,赋值是列表或数组时,长度必须相匹配
frame1['id']=np.arange(4)
"""frame1=
names sex  age  id
a  Bo
b  M  21  0
b  Jane  F  30  1
c  Jack  M  26  2
d  Ann  F  28  3
"""
#若赋值的是⼀个Series,将精确匹配DataFrame的索引,空位将补上缺失值frame1['id']=Series([11,12],index=['a','c'])
"""frame1=
names sex  age    id
a  Bo
b  M  21  11.0
b  Jane  F  30  NaN
c  Jack  M  26  12.0
d  Ann  F  28  NaN
"""
#为不存在的列赋⼀个新列
frame1['Female']=frame1.sex=='F'
"""frame1=
names sex  age    id  Female
a  Bo
b  M  21  11.0  False
b  Jane  F  30  NaN    True
c  Jack  M  26  12.0  False
d  Ann  F  28  NaN    True
"""
#删除列数据
del frame1['Female']
"""frame1=
names sex  age    id
a  Bo
b  M  21  11.0
b  Jane  F  30  NaN
c  Jack  M  26  12.0
d  Ann  F  28  NaN
"""
#嵌套字典(字典的字典)作为参数,传⼊DataFrame
#外层字典的键作为列(columns),内层键作为⾏索引(index)
pop={'Nevada':{2001:2.4,2002:2.9},'Ohio':{2000:1.5,2001:1.7,2002:3.6}} frame2=DataFrame(pop)
"""frame2=
Nevada  Ohio
2000    NaN  1.5
2001    2.4  1.7
2002    2.9  3.6
"""
#对结果进⾏转置
frame2.T
"""result:
2000  2001  2002
Nevada  NaN  2.4  2.9
Ohio    1.5  1.7  3.6
"""
#显⽰指定索引
DataFrame(pop,index=[2001,2002,2003])

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。