首页 > 编程 > Python > 正文

对pandas中两种数据类型Series和DataFrame的区别详解

2020-01-04 14:05:41
字体:
来源:转载
供稿:网友

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 s2obj1=s2.values# print obj1obj2=s2.index# print obj2# print s2[s2>4]# print s2['b']

pandas,数据类型,Series,DataFrame

1.Series 它是有索引,如果我们未指定索引,则是以数字自动生成。

下面是一些例子:

obj=Series([4,7,-5,3])print obj#输出结果如下:# 0  4# 1  7# 2  -5# 3  3print 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'] #输出结果:-5print 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  3print 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: boolprint pd.notnull(obj4)#输出结果如下:# California  False# Ohio      True# Oregon     True# Texax     True# dtype: boolprint 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: float64print 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: int64obj2['Bob']=15print obj2#输出结果如下:# Bob    15# Steven   7# Jeff   -5# Ryan    3# dtype: int64print obj2['Bob'].values #没有这种表示法,报错。因为类似字典取值,直接取键值即可print obj2.values #查看所有值

3. DataFrame相当于有表格,有行表头和列表头

a=pd.DataFrame(np.random.rand(4,5),index=list("ABCD"),columns=list('abcde'))print a

pandas,数据类型,Series,DataFrame

4.DataFrame的一些操作

#增加列或修改列a['f']=[1,2,3,4]a['e']=10print aprint "======================="#增加行或修改行a.ix['D']=10# print aS=pd.DataFrame(np.random.rand(4,6),index=list('EFGH'),columns=list('abcdef'))a=a.append(S)print aprint "======================="#切片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 aa=a.drop('a',axis=1) #删除'a'列,axis=0表示行,axis=1表示列print aprint "======================="#缺省值处理a.iloc[2,3]=None #取第三行第4列值设为Nonea.iloc[4,0]=None #取第五行第1列值设为Noneprint aa=a.fillna(5) #缺省值处(即NaN处填充为5)print a#缺省值去行即有缺省值的把这一行都去掉a.iloc[2,3]=Nonea.iloc[4,0]=Noneprint aa=a.dropna() #删除缺省值为NaN的行print aprint "======================="#读取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 npfrom numpy import randomimport matplotlib.pyplot as pltfrom numpy.linalg import inv,qrfrom pandas import Series,DataFrameimport 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 NaNprint 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: objectprint 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#赋值一个Seriesval=Series([-1.2,-1.5,-1.7],index=['two','four','five'])frame2['debt']=valprint 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,否则返回Falseprint 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  Falsedel 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.7print 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.6print DataFrame(pop,index=[2001,2002,2003])#输出结果如下:#    Nevada Ohio# 2001   2.4  1.7# 2002   2.9  3.6# 2003   NaN  NaNpdata={'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的区别详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持VEVB武林网。


注:相关教程知识阅读请移步到python教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表