参考链接: 带有Pandas的Python:带有示例的DataFrame教程

导读:pandas是一款开放源码的BSD许可的Python库。它基于NumPy创建,为Python编程语言提供了高性能的、易于使用的数据结构和数据分析工具。

pandas应用领域广泛,包括金融、经济、统计、分析等学术和商业领域。本文将介绍pandas中Series、DataFrame、Index等常用类的基本用法。

作者:李明江 张良均 周东平 张尚佳

来源:大数据DT(ID:hzdashuju)

pandas提供了众多类,可满足不同的使用需求,其中常用的类如下所示。

Series:基本数据结构,一维标签数组,能够保存任何数据类型DataFrame:基本数据结构,一般为二维数组,是一组有序的列Index:索引对象,负责管理轴标签和其他元数据(比如轴名称)groupby:分组对象,通过传入需要分组的参数实现对数据分组Timestamp:时间戳对象,表示时间轴上的一个时刻Timedelta:时间差对象,用来计算两个时间点的差值

在这6个类中,Series、DataFrame和Index是使用频率最高的类。

01 Series

Series由一组数据以及一组与之对应的数据标签(即索引)组成。Series对象可以视作一个NumPy的ndarray,因此许多NumPy库函数可以作用于Series。

1. 创建Series

创建Series对象的函数是Series,它的主要参数是data和index,其基本语法格式如下。

class pandas.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)

Series函数常用的参数及其说明如下所示。

data:接收array或dict。表示接收的数据。默认为Noneindex:接收array或list。表示索引,它必须与数据长度相同。默认为Nonename:接收string或list。表示Series对象的名称。默认为None

Series本质上是一个ndarray,通过ndarray创建Series对象,如代码清单6-1所示。

代码清单6-1 通过ndarray创建Series

import pandas as pd

import numpy as np

print('通过ndarray创建的Series为:\n',

pd.Series(np.arange(5), index = ['a', 'b', 'c', 'd', 'e'], name = 'ndarray'))

输出:

通过ndarray创建的Series为:

a    0

b    1

c    2

d    3

e    4

Name: ndarray, dtype: int32

若数据存放于一个dict中,则可以通过dict创建Series,此时dict的键名(key)作为Series的索引,其值会作为Series的值,因此无须传入index参数。通过dict创建Series对象,如代码清单6-2所示。

代码清单6-2 通过dict创建Series

dit = {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4}

print('通过dict创建的Series为:\n', pd.Series(dit))

输出:

通过dict创建的Series为:

a    0

b    1

c    2

d    3

e    4

dtype: int64

通过list创建Series,类似于通过ndarray创建Series,如代码清单6-3所示。

代码清单6-3 通过list创建Series

list1 = [0, 1, 2, 3, 4]

print('通过list创建的Series为:\n', pd.Series(list1, index = ['a', 'b', 'c', 'd', 'e'], name = 'list'))

输出:

通过list创建的Series为:

a    0

b    1

c    2

d    3

e    4

Name: list, dtype: int64

Series拥有8个常用属性,如下所示。

values:以ndarray的格式返回Series对象的所有元素index:返回Series对象的索引dtype:返回Series对象的数据类型shape:返回Series对象的形状nbytes:返回Series对象的字节数ndim:返回Series对象的维度size:返回Series对象的个数T:返回Series对象的转置

访问Series的属性,如代码清单6-4所示。

代码清单6-4 访问Series的属性

series = pd.Series(list1, index = ['a', 'b', 'c', 'd', 'e'], name = 'list')

print('数组形式返回Series为:', series.values)

#输出:数组形式返回Series为: [0 1 2 3 4]

print('Series的Index为:', series.index)

#输出:Series的Index为:Index(['a', 'b', 'c', 'd', 'e'], dtype='object')

print('Series的形状为:', series.shape)

#输出:Series的形状为: (5,)

print('Series的维度为:', series.ndim)

#输出:Series的维度为:1

2. 访问Series数据

索引与切片是Series最常用操作之一。通过索引位置访问Series的数据与ndarray相同,如代码清单6-5所示。

代码清单6-5 通过索引位置访问Series数据子集

print('Series位于第1位置的数据为:', series[0])

输出:

Series位于第1位置的数据为: 0

相比ndarray,通过索引名称(标签)也可以访问Series数据,如代码清单6-6所示。

代码清单6-6 通过索引名称访问Series数据

print('Series中Index为a的数据为:', series['a'])

输出:

Series中Index为a的数据为: 0

此外,也可通过bool类型的Series、list或array访问Series数据,如代码清单6-7所示。

代码清单6-7 通过bool数组访问Series数据

bool = (series < 4)

print('bool类型的Series为:\n', bool)

输出:

bool类型的Series为:

a     True

b     True

c     True

d     True

e    False

Name: list, dtype: bool

print('通过bool数据访问Series结果为:\n', series[bool])

输出:

通过bool数据访问Series结果为:

a    0

b    1

c    2

d    3

Name: list, dtype: int64

3. 更新、插入和删除

更新Series的方法十分简单,采用赋值的方式对指定索引标签(或位置)对应的数据进行修改即可,如代码清单6-8所示。

代码清单6-8 更新Series

# 更新元素

series['a'] = 3

print('更新后的Series为:\n', series)

输出:

更新后的Series为:

a    3

b    1

c    2

d    3

e    4

Name: list, dtype: int64

类似list,通过append方法能够在原Series上插入(追加)新的Series。若只在原Series上插入单个值,则采用赋值方式即可,如代码清单6-9所示。

代码清单6-9 追加Series和插入单个值

series1 = pd.Series([4, 5], index = ['f', 'g'])

# 追加Series

print('在series插入series1后为:\n', series.append(series1))

输出:

在series插入series1后为:

a    3

b    1

c    2

d    3

e    4

f    4

g    5

dtype: int64

# 新增单个数据

series1['h'] = 7

print('在series1插入单个数据后为:\n', series1)

输出:

在series1插入单个数据后为:

f    4

g    5

h    7

dtype: int64

一般使用drop方法删除Series元素,它接收被删除元素对应的索引,inplace=True表示对原Series起作用,如代码清单6-10所示。

代码清单6-10 删除Series元素

# 删除数据

series.drop('e', inplace = True)

print('删除索引e对应数据后的series为:\n', series)

输出:

删除索引e对应数据后的series为:

a    3

b    1

c    2

d    3

Name: list, dtype: int64

02 DataFrame

DataFrame是pandas基本数据结构,类似数据库中的表。DataFrame既有行索引,也有列索引,它可以看作Series组成的dict,每个Series看作DataFrame的一个列。

1. 创建DataFrame

DataFrame函数用于创建DataFrame对象,其基本语法格式如下。

class pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)

DataFrame函数常用的参数及其说明如下所示。

data:接收ndarray,dict,list或DataFrame。表示输入数据。默认为Noneindex:接收Index,ndarray。表示索引。默认为Nonecolumns:接收Index,ndarray。表示列标签(列名)。默认为None

创建DataFrame的方法有很多,常见的一种是传入一个由等长list或ndarray组成的dict。若没有传入columns参数,则传入的dict的键会被当作列名,如代码清单6-11所示。

代码清单6-11 通过dict创建DataFrame

dict1 = {'col1': [0, 1, 2, 3, 4], 'col2': [5, 6, 7, 8, 9]}

print('通过dict创建的DataFrame为:\n', pd.DataFrame(dict1, index = ['a', 'b', 'c', 'd', 'e']))

输出:

通过dict创建的DataFrame为:

col1  col2

a     0     5

b     1     6

c     2     7

d     3     8

e     4     9

通过list或ndarray也可创建DataFrame,如代码清单6-12所示。

代码清单6-12 通过list创建DataFrame

list2 = [[0, 5], [1, 6], [2, 7], [3, 8], [4, 9]]

print('通过list创建的DataFrame为:\n',

pd.DataFrame(list2, index = ['a', 'b', 'c', 'd', 'e'], columns = ['col1', 'col2']))

输出:

通过list创建的DataFrame为:

col1  col2

a     0     5

b     1     6

c     2     7

d     3     8

e     4     9

由于DataFrame是二维数据结构,包含列索引(列名),因此较Series有更多的属性。DataFrame常用的属性及其说明如下所示。

values:以ndarray的格式返回DataFrame对象的所有元素index:返回DataFrame对象的Indexcolumns:返回DataFrame对象的列标签dtypes:返回DataFrame对象的数据类型axes:返回DataFrame对象的轴标签ndim:返回DataFrame对象的轴尺寸数size:返回DataFrame对象的个数shape:返回DataFrame对象的形状

访问创建的DataFrame的常用属性,如代码清单6-13所示。

代码清单6-13 访问DataFrame的属性

df = pd.DataFrame({'col1': [0, 1, 2, 3, 4], 'col2': [5, 6, 7, 8, 9]},

index = ['a', 'b', 'c', 'd', 'e'])

print('DataFrame的Index为:', df.index)

#输出:DataFrame的Index为:Index(['a', 'b', 'c', 'd', 'e'], dtype='object')

print('DataFrame的列标签为:', df.columns)

#输出:DataFrame的列标签为:Index(['col1', 'col2'], dtype='object')

print('DataFrame的轴标签为:', df.axes)

#输出:DataFrame的轴标签为: [Index(['a', 'b', 'c', 'd', 'e'], dtype='object'), Index(['col1', 'col2'], dtype='object')]

print('DataFrame的维度为:', df.ndim)

#输出:DataFrame的维度为:2

print('DataFrame的形状为:', df.shape)

#输出:DataFrame的形状为: (5, 2)

2. 访问DataFrame首尾数据

head和tail方法用于访问DataFrame前n行和后n行数据,默认返回5行数据,如代码清单6-14所示。

代码清单6-14 访问DataFrame前后n行数据

print('默认返回前5行数据为:\n', df.head())

输出:

默认返回前5行数据为:

col1  col2

a     0     5

b     1     6

c     2     7

d     3     8

e     4     9

print('返回后3行数据为:\n', df.tail(3))

输出:

返回后3行数据为:

col1  col2

c     2     7

d     3     8

e     4     9

3. 更新、插入和删除

类似Series,更新DataFrame列也采用赋值的方法,对指定列赋值即可,如代码清单6-15所示。

代码清单6-15 更新DataFrame

# 更新列

df['col1'] = [10, 11, 12, 13, 14]

print('更新列后的DataFrame为:\n', df)

输出:

更新列后的DataFrame为:

col1  col2

a    10     5

b    11     6

c    12     7

d    13     8

e    14     9

插入列也可以采用赋值方法,如代码清单6-16所示。

代码清单6-16 采用赋值的方法插入列

# 插入列

df['col3'] = [15, 16, 17, 18, 19]

print('插入列后的DataFrame为:\n', df)

输出:

插入列后的DataFrame为:

col1  col2  col3

a    10     5    15

b    11     6    16

c    12     7    17

d    13     8    18

e    14     9    19

删除列的方法有多种,如del、pop、drop等。常用的是drop方法,它可以删除行或者列,基本语法格式如下。

DataFrame.drop(labels, axis=0, level=None, inplace=False, errors='raise')

drop方法常用的参数及其说明如下所示。

labels:接收string或array。表示删除的行或列的标签。无默认值axis:接收0或1。表示执行操作的轴向,其中0表示删除行,1表示删除列。默认为0levels:接收int或者索引名。表示索引级别。默认为Noneinplace:接收bool。表示操作是否对原数据生效。默认为False

使用drop方法删除数据,如代码清单6-17所示。

代码清单6-17 使用drop方法删除数据

# 删除列

df.drop(['col3'], axis = 1, inplace = True)

print('删除col3列后的DataFrame为:\n', df)

输出:

删除col3列后的DataFrame为:

col1  col2

a    10     5

b    11     6

c    12     7

d    13     8

e    14     9

# 删除行

df.drop('a', axis = 0, inplace = True)

print('删除a行后的DataFrame为:\n', df)

输出:

删除a行后的DataFrame为:

col1  col2

b    11     6

c    12     7

d    13     8

e    14     9

03 Index

Index对象为其余pandas对象存储轴标签、管理轴标签和其他元数据(如轴名称)。创建Series或DataFrame等对象时,索引都会被转换为Index对象。主要Index对象及其说明如下所示。

Index:一般的Index对象MultiIndex:层次化Index对象DatetimeIndex:Timestamp索引对象PeriodIndex:Period索引对象

1. 创建Index

Index对象可以通过pandas.Index()函数创建,也可以通过创建数据对象Series、DataFrame时接收index(或column)参数创建,前者属于显式创建,后者属于隐式创建。隐式创建中,通过访问index(或针对DataFrame的column)属性即得到Index。创建的Index对象不可修改,保证了Index对象在各个数据结构之间的安全共享。Series的索引是一个Index对象。访问Series索引,如代码清单6-18所示。

代码清单6-18 访问Series索引

print('series的Index为 :\n', series.index)

输出:

series的Index为 :

Index(['a', 'b', 'c', 'd'], dtype='object')

Index对象常用的属性及其说明如下所示。

is_monotonic:当各元素均大于前一个元素时,返回Trueis_unique:当Index没有重复值时,返回True

访问Index属性,如代码清单6-19所示。

代码清单6-19 访问Index属性

print('series中Index各元素是否大于前一个:', series.index.is_monotonic)

#输出:series中Index各元素是否大于前一个:True

print('series中Index各元素是否唯一:', series.index.is_unique)

#输出:series中Index各元素是否唯一:True

2. 常用方法

Index对象的常用方法及其说明如下所示。

append:连接另一个Index对象,产生一个新的Indexdifference:计算两个Index对象的差集,得到一个新的Indexinterp:计算两个Index对象的交集union:计算两个Index对象的并集isin:计算一个Index是否在另一个Index,返回bool数组delete:删除指定Index的元素,并得到新的Indexdrop:删除传入的值,并得到新的Indexinsert:将元素插入到指定Index处,并得到新的Indexunique:计算Index中唯一值的数组

应用Index对象的常用方法如代码清单6-20所示。

代码清单6-20 应用Index对象的常用方法

index1 = series.index

index2 = series1.index

print('index1连接index2后结果为:\n', index1.append(index2))

#输出:index1连接index2后结果为:

# Index(['a', 'b', 'c', 'd', 'f', 'g', 'h'], dtype='object')

print('index1与index2的差集为:', index1.difference(index2))

#输出:index1与index2的差集为:Index(['a', 'b', 'c', 'd'], dtype='object')

print('index1与index2的交集为:', index1.interp(index2))

#输出:index1与index2的交集为:Index([], dtype='object')

print('index1与index2的并集为:\n', index1.union(index2))

#输出:index1与index2的并集为:

# Index(['a', 'b', 'c', 'd', 'f', 'g', 'h'], dtype='object')

print('index1中的元素是否在index2中:', index1.isin(index2))

#输出:index1中的元素是否在index2中: [False False False False]

关于作者:李明江,资深大数据专家,贵州省计算机学会常务理事,黔南州大数据专家委员会委员,黔南州计算机学会会长,黔南州教育信息化建设专家库专家,黔南民族师范学院计算机与信息学院院长,全国高校大数据教育联盟理事。

张良均,资深大数据挖掘与分析专家、模式识别专家、AI技术专家。有10余年大数据挖掘与分析经验,擅长Python、R、Hadoop、Matlab等技术实现的数据挖掘与分析,对机器学习等AI技术驱动的数据分析也有深入研究。

本文摘编自《Python3智能数据分析快速入门》。

延伸阅读《Python3智能数据分析快速入门》

点击上图了解及购买

转载请联系微信:DoctorData

推荐语:本书假设你有一定的数据分析基础,但是没有Python和AI基础,为了帮助你快速掌握智能数据分析需要的技术和方法,书中有针对性地讲解了Python和AI中必须要掌握的知识点,内容由浅入深,循序渐进。从环境配置、基本语法、基础函数到第三方库的安装与使用,对各个操作步骤、函数、工具、代码示例等的讲解非常详尽,确保所有满足条件的读者都能快速入门。

更多精彩回顾

书讯 |10月书讯(下)| 双节同庆,读书正当时

书讯 |10月书讯(上)| 双节同庆,读书正当时

上新 | 5G时代音视频开发王器:WebRTC书单 | 开学季——想打好数学基础?这些经典教材你最需要!

干货 | 用户画像从0到100的构建思路

收藏 | 逐行分析鸿蒙系统的 JavaScript 开发框架

视频 | 大佬出镜推荐不可不读系列——Java建设者号主cxuan

点击阅读全文购买

[转载] pandas入门:Series、DataFrame、Index基本操作都有了!相关推荐

  1. dataframe两个表合并_Part25:Pandas基础(Series,DataFrame类的创建、索引、切片、算术方法)...

    一.为什么学习pandas numpy已经可以帮助我们进行数据的处理了,那么学习pandas的目的是什么呢? numpy能够帮助我们处理的是数值型的数据,当然在数据分析中除了数值型的数据还有好多其他类 ...

  2. [转载] pandas入门

    参考链接: Python | 使用Panda合并,联接和连接DataFrame 这些是pandas最基本的操作和我自己的理解 In [1]: import pandas as pd In [2]: i ...

  3. 【DS with Python】 Pandas中Series DataFrame的结构、创建、查询、修改语法与实例

    文章目录 前言 一.Series结构与应用 1.1 Series的构造 1.2 创建Series 1.2.1 可用于创建Series的类型 1.2.2 三种设置index的方法 1.2.3 Serie ...

  4. pandas 入门:DataFrame的创建,读写,插入和删除

    不得不说DataFrame现在很火,已经有很多库都是基于DataFrame写的,而且它用起来也很方便,读excel只需要一行代码,想起使用xlrd的日子,至今还脑壳疼,所以对于一个用python做数据 ...

  5. [转载] pandas中Series数组创建方法

    参考链接: 访问Pandas Series的元素 import numpy as np import pandas as pd ar = np.random.rand(5) # s = pd.Seri ...

  6. [转载] pandas将Series变成键值对

    参考链接: Pandas的数据Series 代码 下面的代码就会将一个series转换成一个list,然后,list中的对象就是键值对 类似于下面的范式: [(index, value)-] list ...

  7. pandas 入门(2)

    from pandas import Series, DataFrame, Index import numpy as np from numpy import nan as NAobj = Seri ...

  8. pandas数据结构:Series/DataFrame;python函数:range/arange

    1. Series Series 是一个类数组的数据结构,同时带有标签(lable)或者说索引(index). 1.1 下边生成一个最简单的Series对象,因为没有给Series指定索引,所以此时会 ...

  9. dataframe python格式_python3.6 pandas,Series和DataFrame基础格式与用法,附代码实例

    pandas 是基于numpy构建的库,加上numpy,主要用于科学运算和数据处理. 也是一个让我忘记昂贵的MATLAB,并且不得不复习SQL的库.. 一般引入规定: In [105]: from p ...

最新文章

  1. 深度分析Java的枚举类型——枚举的线程安全性及序列化问题
  2. 【Maven】maven 插件开发实战
  3. python strip() 函数探究
  4. vb 读取mysql所有表名_vb怎么列举出一个mdb数据库里面所有表名?
  5. dos系统功能调用的屏幕显示字符是( )号调用_四、WIN10模拟DOS环境之8086汇编实战...
  6. 清新BLOG-CMS博客主题源码
  7. Android studio 使用心得(八)----测试程序单元测试
  8. python服务器搭建nginx_python服务器环境搭建Flask,uwsgi和nginx
  9. 算法_深度LSTM笔记[博]
  10. 课时2 一些默认样式
  11. JSP之实现分页查询
  12. PHP如何判断图片是否伪造
  13. MySQL 系统表列注释的应用
  14. ubuntu安装nvidia显卡驱动黑屏nvidia-smi黑屏-显卡故障
  15. Windows命令实现匿名邮件发送
  16. Convex Optimization 凸优化学习 第三章 凸函数(一)
  17. 换帅缘于投入 SAP中国新总裁上手仍需时间
  18. LESS 和 SCSS 的区别
  19. [原创]我个人整理的AD/2000技巧,各位收藏吧!60多个。
  20. c语言教程英文版讲义,c语言教程英文版讲义(四).pdf

热门文章

  1. 【POJ3889】Fractal Streets(分形图)
  2. mysql5.6.19安装图解_mysql5.6.19安装说明
  3. 递归java程序_JAVA编程基础之递归结构
  4. python与人工智能的关系_广东江门的北大青鸟学校了解到人工智能与Python关系
  5. bootstrap媒体查询类型的值_HTMLCSS学习笔记(二十一)-- 媒体查询 + rem用法
  6. Unity3D之NGUI基础6.1:按钮交互
  7. 2018 CodeM复赛:B. 软件包管理器(二分)
  8. 二维树状数组(bzoj 1452: [JSOI2009]Count)
  9. windows安装pip包
  10. 不显示负频率的部分,坐标轴转换为频率,幅值量纲还原改善频谱图以及功率谱和对数功率谱