对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 测试实现方法
Dec 24 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
May 27 Python
python导出chrome书签到markdown文件的实例代码
Dec 27 Python
答题辅助python代码实现
Jan 16 Python
python实现简易内存监控
Jun 21 Python
Python定义一个跨越多行的字符串的多种方法小结
Jul 19 Python
tensorflow 加载部分变量的实例讲解
Jul 27 Python
python 利用文件锁单例执行脚本的方法
Feb 19 Python
详解Python连接MySQL数据库的多种方式
Apr 16 Python
python命令行工具Click快速掌握
Jul 04 Python
Django用户认证系统 组与权限解析
Aug 02 Python
关于探究python中sys.argv时遇到的问题详解
Feb 23 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
thinkPHP5实现的查询数据库并返回json数据实例
2017/10/23 PHP
js判断输入是否为数字的具体实例
2013/08/03 Javascript
javascript父、子页面交互技巧总结
2014/08/08 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
2015/12/04 Javascript
详解Bootstrap glyphicons字体图标
2016/01/04 Javascript
JavaScript类的写法
2016/09/17 Javascript
JS实现批量上传文件并显示进度功能
2017/06/27 Javascript
jquery拖动改变div大小
2017/07/04 jQuery
Vue多种方法实现表头和首列固定的示例代码
2018/02/02 Javascript
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
2018/08/25 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
微信小程序实现写入读取缓存详解
2019/08/30 Javascript
实例讲解JavaScript 计时事件
2020/07/04 Javascript
python使用cookie库操保存cookie详解
2014/03/03 Python
Python解释执行原理分析
2014/08/22 Python
在Python中使用元类的教程
2015/04/28 Python
Python实现的多线程同步与互斥锁功能示例
2017/11/30 Python
tensorflow建立一个简单的神经网络的方法
2018/02/10 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
2018/05/30 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
python基础 range的用法解析
2019/08/23 Python
python右对齐的实例方法
2020/07/05 Python
用JAVA SOCKET编程,读服务器几个字符,再写入本地显示
2012/11/25 面试题
请解释接口的显式实现有什么意义
2012/05/26 面试题
毕业实习个人鉴定范文
2013/12/10 职场文书
中级会计职业生涯规划范文
2014/01/16 职场文书
开会迟到检讨书
2014/02/03 职场文书
小班开学寄语
2014/04/04 职场文书
应届大专生求职信
2014/06/26 职场文书
环境科学专业求职信
2014/08/04 职场文书
农行心得体会
2014/09/02 职场文书
病人慰问信范文
2015/02/15 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
python cv2图像质量压缩的算法示例
2021/06/04 Python
win10电脑老是死机怎么办?win10系统老是死机的解决方法
2022/08/05 数码科技