对pandas中两种数据类型Series和DataFrame的区别详解
1. series相当于数组numpy.array类似
s1=pd.series([1,2,4,6,7,2]) s2=pd.series([4,3,1,57,8],index=['a','b','c','d','e']) print s2 obj1=s2.values # print obj1 obj2=s2.index # print obj2 # print s2[s2>4] # print s2['b']
1.series 它是有索引,如果我们未指定索引,则是以数字自动生成。
下面是一些例子:
obj=series([4,7,-5,3]) print obj #输出结果如下: # 0 4 # 1 7 # 2 -5 # 3 3 print obj.values #取出它的值 #[ 4 7 -5 3] print obj.index #取出索引值 #输出结果如下: # rangeindex(start=0, stop=4, step=1) obj2=series([4,7,-5,3],index=['d','b','a','c']) print obj2 #输出结果如下: # d 4 # b 7 # a -5 # c 3 #可以通过索引的方式选择series中的单个或一组值 print obj2['a'] #输出结果:-5 print obj2['d'] #输出结是:4
2. series的一些操作
series.order()进行排序,而dataframe则用sort或者sort_index
print ratings_by_title.order(ascending=false)[:10]
(1)numpy数组运算(根据布尔型数组进行过滤、标量乘法、应用数学函数等)都会保留索引和值之间的链接
print obj2[obj2>0] #取出>0的值 #输出结果如下: # d 4 # b 7 # c 3 print obj2*2 #输出结果如下: # d 8 # b 14 # a -10 # c 6
(2)还可以将series看成是一个定长的有序字典,因为它是索引值到数据值的一个映射。它可以用在许多原来需要字典参数的函数中。
print 'b' in obj2 #obj2中有索引'b'?若有就返回'true'
(3)如果数据被存在一个python字典中,也可以直接通过这个字典来创建series.
sdata={'ohio':35000,'texax':71000,'oregon':16000,'utah':5000} obj3=series(sdata) print obj3 #输出结果如下: # ohio 35000 # oregon 16000 # texax 71000 # utah 5000 #注:如果只传入一个字典,则结果series中的索引就是原字典的键(有序排列) states=['california','ohio','oregon','texax'] obj4=series(sdata,index=states) #将sdata字典创建series,索引用states来创建 print obj4 #california在sdata中没有相应的值,故是nan缺省值 # california nan # ohio 35000.0 # oregon 16000.0 # texax 71000.0
(4)pandas中的isnull和notnull函数可以用于检测缺失数据,series也有类似的方法
print pd.isnull(obj4) #输出结果如下: # california true # ohio false # oregon false # texax false # dtype: bool print pd.notnull(obj4) #输出结果如下: # california false # ohio true # oregon true # texax true # dtype: bool print obj4.isnull() #series的isnull方法 #输出结果如下: # california true # ohio false # oregon false # texax false # dtype: bool
(5)series最重要的一个功能是:它在算术运算中会自动对齐不同索引的数据。
print obj3,obj4 # ohio 35000 # oregon 16000 # texax 71000 # utah 5000 # dtype: int64 # # california nan # ohio 35000.0 # oregon 16000.0 # texax 71000.0 # dtype: float64 print obj3+obj4 # california nan # ohio 70000.0 # oregon 32000.0 # texax 142000.0 # utah nan # dtype: float64
(6)series对象本身及其索引都有一个name属性,该属性跟pandas其他的关键功能关系非常密切
obj4.name='population' obj4.index.name='state' print obj4 #输出如下:加上state和name # state # california nan # ohio 35000.0 # oregon 16000.0 # texax 71000.0 # name: population, dtype: float64
(7)series的索引可以通过赋值的方式就地修改
obj2.index=['bob','steven','jeff','ryan'] print obj2 #输出结果如下: # bob 4 # steven 7 # jeff -5 # ryan 3 # dtype: int64 obj2['bob']=15 print obj2 #输出结果如下: # bob 15 # steven 7 # jeff -5 # ryan 3 # dtype: int64 print obj2['bob'].values #没有这种表示法,报错。因为类似字典取值,直接取键值即可 print obj2.values #查看所有值
3. dataframe相当于有表格,有行表头和列表头
a=pd.dataframe(np.random.rand(4,5),index=list("abcd"),columns=list('abcde')) print a
4.dataframe的一些操作
#增加列或修改列 a['f']=[1,2,3,4] a['e']=10 print a print "=======================" #增加行或修改行 a.ix['d']=10 # print a s=pd.dataframe(np.random.rand(4,6),index=list('efgh'),columns=list('abcdef')) a=a.append(s) print a print "=======================" #切片 print (a[['b','e']]) #取'b','e'列 print a.loc['a':'d',['a','c','f']] #取'a'-'d'行'a','c','f'列 print "=======================" #减少行或减少列 a=a.drop(['c','d']) #删除'c'行和'd' print a a=a.drop('a',axis=1) #删除'a'列,axis=0表示行,axis=1表示列 print a print "=======================" #缺省值处理 a.iloc[2,3]=none #取第三行第4列值设为none a.iloc[4,0]=none #取第五行第1列值设为none print a a=a.fillna(5) #缺省值处(即nan处填充为5) print a #缺省值去行即有缺省值的把这一行都去掉 a.iloc[2,3]=none a.iloc[4,0]=none print a a=a.dropna() #删除缺省值为nan的行 print a print "=======================" #读取excel,适当改动后,保存到excel中 e1=pd.read_excel('test.xlsx',sheetname='sheet1') e1.columns=['class','no','name','sex','dormitory','phonenumber'] print(e1) print(e1.ix[2]) print(e1['class']) print(e1.sex) #可将取出的数据处理,处理完后再保存到excel中去 e2=pd.read_excel('test_copy.xlsx',sheetname='sheet1',names='table1',header=none) e2.columns=['a','b','c','d'] print(e2) e2.to_excel('test_write.xlsx',header=false,index=false)
(1)构建dataframe 的方法很多,最常用的一种是直接传入一个由等长列表或者numpy数组组成的字典
import numpy as np from numpy import random import matplotlib.pyplot as plt from numpy.linalg import inv,qr from pandas import series,dataframe import pandas as pd
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
(2)如果指定了列序列,则dataframe的列就会按照指定的顺序进行排序
frame1=dataframe(data,columns=['year','state','pop']) print frame1 #输出的结果如下: # 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
(3)跟series一样,如果传入的列在数据中找不到,就会产生na值
frame2=dataframe(data,columns=['year','state','pop','debt'], index=['one','two','three','four','five']) #column列的索引,index是行的索引 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 print frame2.columns #输出列的索引 #输出结果如下: # index([u'year', u'state', u'pop', u'debt'], dtype='object')
(4)类似字典标记的方式或属性的方式,可以将dataframe的列获取为一个series.
print frame2['state'] #取出列索引为state的列的数据 #输出结果如下: # one ohio # two ohio # three ohio # four nevada # five nevada # name: state, dtype: object print frame2.year #输出结果如下: # one 2000 # two 2001 # three 2002 # four 2001 # five 2002 # name: year, dtype: int64
(5)返回的series拥有原dataframe相同的索引,且其name属性也已经被相应地设置好了。行也可以通过位置或名称的方式进行获取
比如用索引字段ix,ix是取行的索引
print frame2.ix['three'] #输出的结果如下: # year 2002 # state ohio # pop 3.6 # debt nan # name: three, dtype: object
(6)可以通过赋值的方式进行修改。
# frame2['debt']=16.5 #debt列全为16.5 # print 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 #将列表或数组赋值给某个列时,其长度必须跟dataframe的长度相匹配。 #如果赋值的是一个series,就会精确匹配dataframe的索引,所有的空位都将被填上缺失值。 frame2['debt']=np.arange(5.) print frame2 #输出结果如下: # year state pop debt # one 2000 ohio 1.5 0.0 # two 2001 ohio 1.7 1.0 # three 2002 ohio 3.6 2.0 # four 2001 nevada 2.4 3.0 # five 2002 nevada 2.9 4.0 #赋值一个series val=series([-1.2,-1.5,-1.7],index=['two','four','five']) frame2['debt']=val print frame2 #输出结果如下:不在index中的索引的值都赋了nan # 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' #没有eastern列,固会自动增加一列 #frame2.state=='ohio'如果等于则返回true,否则返回false print 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列 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 print frame2.columns #查看frame2的列 #输出结果如下:index([u'year', u'state', u'pop', u'debt'], dtype='object')
(7)另一种常见的数据形式是嵌套字典(也就是字典的字典)
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 #可以对frame进行转置 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 pdata={'ohio':frame3['ohio'][:-1], 'nevada':frame3['nevada'][:2]} print dataframe(pdata) #输出结果如下: # nevada ohio # 2000 nan 1.5 # 2001 2.4 1.7
可以输入给dataframe构造器的数据:
二维ndarray 数据矩阵,还可以传入行标和列标 由数组、列表或元组组成的字典 每个序列会变成dataframe的一列,所有序列的长度必须相同 numpy的结构化/记录数组 类似于“由数组组成的字典” 由series组成的字典 每个series会成为一列。如果没显式指定索引,由各series的索引会被合 并成结果的行索引 由字典组成的字典 各内层字典会成为一列。键会被合并成结果的行索引,跟“由series组成的字典” 的情况一样 字典或series的列表 各项将会成为dataframe的一行。字典键或series索引的并集将会成为dataframe 的列标 由列表或元组组成的列表 类似于“二维ndarray” 另一个dataframe 该dataframe的索引将会被沿用,除非显式指定了其它索引 numpy的maskedarray 类似于"二维ndarray"的情况,只是掩码值在结果dataframe会变成na/缺失值
#如果设置了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]] #如果dataframe各列的数据类型不同,则值数组的数据类型就会选用能兼容所有列的数据类型 print frame2.values # [[2000 'ohio' 1.5 nan] # [2001 'ohio' 1.7 -1.2] # [2002 'ohio' 3.6 nan] # [2001 'nevada' 2.4 -1.5] # [2002 'nevada' 2.9 -1.7]]
以上这篇对pandas中两种数据类型series和dataframe的区别详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。