对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实现电子词典
Apr 23 Python
Python新手在作用域方面经常容易碰到的问题
Apr 03 Python
Python多线程编程(四):使用Lock互斥锁
Apr 05 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
Mar 19 Python
python3如何将docx转换成pdf文件
Mar 23 Python
Python中asyncio与aiohttp入门教程
Oct 16 Python
在Python中获取两数相除的商和余数方法
Nov 10 Python
Python对excel文档的操作方法详解
Dec 10 Python
Python 转换RGB颜色值的示例代码
Oct 13 Python
python 根据列表批量下载网易云音乐的免费音乐
Dec 03 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
Jan 28 Python
聊聊Python String型列表求最值的问题
Jan 18 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中获取关键词及所属来源搜索引擎名称的代码
2011/02/15 PHP
php中strtotime函数性能分析
2016/11/20 PHP
简单实用的PHP文本缓存类实例
2019/03/22 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
JavaScript 页面坐标相关知识整理
2010/01/09 Javascript
jquery实现div阴影效果示例代码
2013/09/16 Javascript
简单易用的倒计时js代码
2014/08/04 Javascript
JS实现重新加载当前页面
2016/11/29 Javascript
Angular客户端请求Rest服务跨域问题的解决方法
2017/09/19 Javascript
JavaScript实现的简单加密解密操作示例
2018/06/01 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
jQuery控制input只能输入数字和两位小数的方法
2019/05/16 jQuery
vue项目中锚点定位替代方式
2019/11/13 Javascript
谈谈我在vue-cli3中用预渲染遇到的坑
2020/04/22 Javascript
vue实现页面切换滑动效果
2020/06/29 Javascript
Vue通过Blob对象实现导出Excel功能示例代码
2020/07/31 Javascript
python设计模式大全
2016/06/27 Python
Python使用SocketServer模块编写基本服务器程序的教程
2016/07/12 Python
利用Python2下载单张图片与爬取网页图片实例代码
2017/12/25 Python
Django REST framework内置路由用法
2019/07/26 Python
Python 识别12306图片验证码物品的实现示例
2020/01/20 Python
简单了解Java Netty Reactor三种线程模型
2020/04/26 Python
如何理解Python中包的引入
2020/05/29 Python
css3 图片圆形显示 如何CSS将正方形图片显示为圆形图片布局
2014/10/10 HTML / CSS
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
Skyscanner香港:机票比价, 平机票和廉价航空机票预订
2020/02/07 全球购物
瑞士首家网上药店折扣店:McDrogerie
2020/12/22 全球购物
管理失职检讨书
2014/02/12 职场文书
高中毕业生的个人自我评价
2014/02/21 职场文书
出生公证委托书
2014/04/03 职场文书
领导干部“四风”问题批评与自我批评材料
2014/09/24 职场文书
2015年幼儿教师个人工作总结
2015/05/20 职场文书
医生行业员工的辞职信
2019/06/24 职场文书
从贫穷到富有,是知识技能和学习力的差别
2019/08/20 职场文书
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
2021/03/29 Python
python 模块重载的五种方法
2021/04/24 Python