对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中捕捉详细异常信息的代码示例
Sep 18 Python
python基础_文件操作实现全文或单行替换的方法
Sep 04 Python
Python使用arrow库优雅地处理时间数据详解
Oct 10 Python
Python中 map()函数的用法详解
Jul 10 Python
selenium+python实现自动化登录的方法
Sep 04 Python
Python常见的pandas用法demo示例
Mar 16 Python
Python 类属性与实例属性,类对象与实例对象用法分析
Sep 20 Python
Django和Flask框架优缺点对比
Oct 24 Python
python通过移动端访问查看电脑界面
Jan 06 Python
python时间日期操作方法实例小结
Feb 06 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
Mar 05 Python
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
May 28 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
德劲1103的维修打理经验
2021/03/02 无线电
php序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
javascript生成随机大小写字母的方法
2014/02/20 Javascript
js实现键盘控制DIV移动的方法
2015/01/10 Javascript
javascript实现二级级联菜单的简单制作
2015/11/19 Javascript
js文本框输入内容智能提示效果
2015/12/02 Javascript
js实现下拉列表选中某个值的方法(3种方法)
2015/12/17 Javascript
jquery实现图片预加载
2015/12/25 Javascript
JavaScript页面实时显示当前时间实例代码
2016/10/23 Javascript
详解Node.js access_token的获取、存储及更新
2017/06/20 Javascript
vue+iview写个弹框的示例代码
2017/12/05 Javascript
vue中的过滤器及其时间格式化问题
2020/04/09 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
2020/05/10 Javascript
使用React-Router实现前端路由鉴权的示例代码
2020/07/26 Javascript
Python运维之获取系统CPU信息的实现方法
2018/06/11 Python
11个Python Pandas小技巧让你的工作更高效(附代码实例)
2019/04/30 Python
python3 tcp的粘包现象和解决办法解析
2019/12/09 Python
opencv3/C++实现视频读取、视频写入
2019/12/11 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
2020/04/17 Python
Python子进程subpocess原理及用法解析
2020/07/16 Python
Python基于Serializer实现字段验证及序列化
2020/11/04 Python
使用CSS3配合IE滤镜实现渐变和投影的效果
2015/09/06 HTML / CSS
使用CSS3制作一个简单的进度条(demo)
2017/05/23 HTML / CSS
澳大利亚首屈一指的在线购物目的地:Kogan.com
2017/02/02 全球购物
The Hut美国/加拿大:英国领先的豪华在线百货商店
2019/03/26 全球购物
学生会竞聘书范文
2014/03/31 职场文书
施工安全承诺书
2014/05/22 职场文书
酒店工程部岗位职责
2015/02/12 职场文书
校本培训个人总结
2015/02/28 职场文书
宝葫芦的秘密观后感
2015/06/11 职场文书
python 机器学习的标准化、归一化、正则化、离散化和白化
2021/04/16 Python
七个非常实用的Python工具包总结
2021/06/15 Python
MySQL系列之十二 备份与恢复
2021/07/02 MySQL
手把手教你使用TensorFlow2实现RNN
2021/07/15 Python
基于Python编写一个监控CPU的应用系统
2022/06/25 Python