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小时内删除。
发表评论