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


Posted in Python onNovember 12, 2018

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

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

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

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

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的区别详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python常用列表数据结构小结
Aug 06 Python
Python中的MongoDB基本操作:连接、查询实例
Feb 13 Python
基于python3 类的属性、方法、封装、继承实例讲解
Sep 19 Python
基于python list对象中嵌套元组使用sort时的排序方法
Apr 18 Python
Python RabbitMQ消息队列实现rpc
May 30 Python
利用Python如何批量修改数据库执行Sql文件
Jul 29 Python
python 循环读取txt文档 并转换成csv的方法
Oct 26 Python
python实现替换word中的关键文字(使用通配符)
Feb 13 Python
python搜索算法原理及实例讲解
Nov 18 Python
七个Python必备的GUI库
Apr 27 Python
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
Jun 11 Python
撤回我也能看到!教你用Python制作微信防撤回脚本
Jun 11 Python
在python中pandas的series合并方法
Nov 12 #Python
浅谈python的dataframe与series的创建方法
Nov 12 #Python
django解决跨域请求的问题
Nov 11 #Python
python 生成图形验证码的方法示例
Nov 11 #Python
老生常谈python中的重载
Nov 11 #Python
Django跨域请求CSRF的方法示例
Nov 11 #Python
Python rstrip()方法实例详解
Nov 11 #Python
You might like
目录,文件操作详谈―PHP
2006/11/25 PHP
php获得用户ip地址的比较不错的方法
2014/02/08 PHP
PHP的AES加密算法完整实例
2016/07/20 PHP
jQuery的学习步骤
2011/02/23 Javascript
jquery实现浮动的侧栏实例
2015/06/25 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
关于JS中二维数组的声明方法
2016/09/24 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
用Object.prototype.toString.call(obj)检测对象类型原因分析
2018/10/11 Javascript
jQuery实现简单聊天室
2020/02/08 jQuery
javascript使用canvas实现饼状图效果
2020/09/08 Javascript
原生js实现表格循环滚动
2020/11/24 Javascript
[00:35]TI7不朽珍藏III——寒冰飞龙不朽展示
2017/07/15 DOTA
Python常用正则表达式符号浅析
2014/08/13 Python
django自带的server 让外网主机访问方法
2018/05/14 Python
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
Pytorch环境搭建与基本语法
2020/06/03 Python
python 5个顶级异步框架推荐
2020/09/09 Python
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
顶撞领导检讨书
2014/01/29 职场文书
函授自我鉴定范文
2014/02/06 职场文书
八一建军节活动方案
2014/02/10 职场文书
《夏夜多美》教学反思
2014/02/17 职场文书
促销活动总结报告
2014/04/26 职场文书
中秋客户感谢信
2015/01/22 职场文书
高中生自我评价范文2015
2015/03/03 职场文书
刑事撤诉申请书
2015/05/18 职场文书
幼儿园班级工作总结2015
2015/05/25 职场文书
孔繁森观后感
2015/06/10 职场文书
2016预备党员培训心得体会
2016/01/08 职场文书
《七月的天山》教学反思
2016/02/19 职场文书
基于Nginx实现限制某IP短时间访问次数
2021/03/31 Servers
教你用eclipse连接mysql数据库
2021/04/22 MySQL
win10+anaconda安装yolov5的方法及问题解决方案
2021/04/29 Python
教你如何用Python实现人脸识别(含源代码)
2021/06/23 Python
Python 多线程处理任务实例
2021/11/07 Python