本文始发于个人公众号:TechFlow,原创不易,求个关注

今天是pandas数据处理专题的第二篇文章,我们一起来聊聊pandas当中最重要的数据结构——DataFrame。

上一篇文章当中我们介绍了Series的用法,也提到了Series相当于一个一维的数组,只是pandas为我们封装了许多方便好用的api。而DataFrame可以简单了理解成Series构成的dict,这样就将数据拼接成了二维的表格。并且为我们提供了许多表级别数据处理以及批量数据处理的接口,大大降低了数据处理的难度。

创建DataFrame

DataFrame是一个表格型的数据结构,它拥有两个索引,分别是行索引以及列索引,使得我们可以很方便地获取对应的行以及列。这就大大降低了我们查找数据处理数据的难度。

首先,我们先从最简单的开始,如何创建一个DataFrame。

从字典创建

我们创建了一个dict,它的key是列名,value是一个list,当我们将这个dict传入DataFrame的构造函数的时候,它将会以key作为列名,value作为对应的值为我们创建一个DataFrame。

当我们在jupyter输出的时候,它会自动为我们将DataFrame中的内容以表格的形式展现。

从numpy数据创建

我们也可以从一个numpy的二维数组来创建一个DataFrame,如果我们只是传入numpy的数组而不指定列名的话,那么pandas将会以数字作为索引为我们创建列

我们在创建的时候为columns这个字段传入一个string的list即可为它指定列名:

从文件读取

pandas另外一个非常强大的功能就是可以从各种格式的文件当中读取数据创建DataFrame,比如像是常用的excel、csv,甚至是数据库也可以。

对于excel、csv、json等这种结构化的数据,pandas提供了专门的api,我们找到对应的api进行使用即可:

如果是一些比较特殊格式的,也没有关系,我们使用read_table,它可以从各种文本文件中读取数据,通过传入分隔符等参数完成创建。比如在上一篇验证PCA降维效果的文章当中,我们从.data格式的文件当中读取了数据。该文件当中列和列之间的分隔符是空格,而不是csv的逗号或者是table符。我们通过传入sep这个参数,指定分隔符就完成了数据的读取。

这个header参数表示文件的哪些行作为数据的列名,默认header=0,也即会将第一行作为列名。如果数据当中不存在列名,需要指定header=None,否则会产生问题。我们很少会出现需要用到多级列名的情况,所以一般情况下最常用的就是取默认值或者是令它等于None。

在所有这些创建DataFrame的方法当中最常用的就是最后一种,从文件读取。因为我们做机器学习或者是参加kaggle当中的一些比赛的时候,往往数据都是现成的,以文件的形式给我们使用,需要我们自己创建数据的情况很少。如果是在实际的工作场景,虽然数据不会存在文件当中,但是也会有一个源头,一般是会存储在一些大数据平台当中,模型从这些平台当中获取训练数据。

所以总体来说,我们很少使用其他创建DataFrame的方法,我们有所了解,着重掌握从文件读取的方法即可。

常用操作

下面介绍一些pandas的常用操作,这些操作是我在没有系统学习pandas的使用方法之前就已经了解的。了解的原因也很简单,因为它们太常用了,可以说是必知必会的常识性内容

查看数据

我们在jupyter当中执行运行DataFrame的实例会为我们打出DataFrame中所有的数据,如果数据行数过多,则会以省略号的形式省略中间的部分。对于数据量很大的DataFrame,我们一般不会直接这样输出展示,而是会选择展示其中的前几条或者是后几条数据。这里就需要用到两个api。

展示前若干条数据的方法叫做head,它接受一个参数,允许我们制定让它从头开始展示我们指定条数的数据。

既然有展示前面若干条自然也有展示最后若干条的api,这样的api叫做tail。通过它我们可以查看DataFrame最后指定条数的数据:

列的增删改查

前面我们曾经提到过,对于DataFrame而言,它其实相当于Series组合成的dict。既然是dict我们自然可以根据key值获取指定的Series。

DataFrame当中有两种方法获取指定的列,我们可以通过.加列名的方式或者也可以通过dict查找元素的方式来查询:

我们也可以同时读取多列,如果是多列的话,只支持一种方法就是通过dict查询元素的方法。它允许接收传入一个list,可以查找出这个list当中的列对应的数据。返回的结果是这些新的列组成的新DataFrame。

我们可以用del删除一个我们不需要的列

我们要创建一个新的列也很简单,我们可以像是dict赋值一样,直接为DataFrame赋值即可:

赋值的对象并不是只能是实数,也可以是一个数组

我们要修改某一列也非常简单,也是通过赋值一样的方法覆盖原数据即可。

转成numpy数组

有时候我们使用pandas不方便,想要获取它对应的原始数据,可以直接使用.values获取DataFrame对应的numpy数组:

由于在DataFrame当中每一列单独一个类型,而转化成numpy的数组之后所有数据共享类型。那么pandas会为所有的列找一个通用类型,这就是为什么经常会得到一个object类型的原因。所以在使用.values之前最好先查看一下类型,保证一下不会因为类型而出错。

总结

在今天的文章当中我们了解了DataFrame与Series的关系,也学习了一些DataFrame的基础和常用的用法。虽然DataFrame可以近似看成是Series组合成的dict,但实际上它作为一个单独的数据结构,也拥有许多自己的api,支持许多花式的操作,是我们处理数据强有力的工具。

有专业机构做过统计,对于一个算法工程师而言,大约70%的时间会被投入在数据的处理上。真正编写模型、调参的时间可能不到20%,从这当中我们可以看到数据处理的必要性和重要程度。在Python领域当中,pandas是数据处理最好用的手术刀和工具箱,希望大家都能将它掌握。

如果喜欢本文,可以的话,来一波三连,给我一点支持吧(关注、在看、点赞)。

本文使用 mdnice 排版

pandas | 使用pandas进行数据处理——DataFrame篇的更多相关文章

  1. pandas | 使用pandas进行数据处理——Series篇

    本文始发于个人公众号:TechFlow,原创不易,求个关注 上周我们关于Python中科学计算库Numpy的介绍就结束了,今天我们开始介绍一个新的常用的计算工具库,它就是大名鼎鼎的Pandas. Pa ...

  2. 吴裕雄--天生自然python学习笔记:pandas模块强大的数据处理套件

    用 Python 进行数据分析处理,其中最炫酷的就属 Pa ndas 套件了 . 比如,如果我 们通过 Requests 及 Beautifulsoup 来抓取网页中的表格数据 , 需要进行较复 杂的 ...

  3. pandas模块(数据分析)------dataframe

    DataFrame DataFrame是一个表格型的数据结构,含有一组有序的列,是一个二维结构. DataFrame可以被看做是由Series组成的字典,并且共用一个索引. 一.生成方式 import ...

  4. pandas基础(3)_数据处理

    1:删除重复数据 使用duplicate()函数检测重复的行,返回元素为bool类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为true >>> df =D ...

  5. pandas 获取不符合条件的dataframe

    pandas 获取不符合条件的dataframe 或将其过滤掉: df[df["col"].str.contains('this'|'that')==False] >> ...

  6. Pandas之:Pandas高级教程以铁达尼号真实数据为例

    Pandas之:Pandas高级教程以铁达尼号真实数据为例 目录 简介 读写文件 DF的选择 选择列数据 选择行数据 同时选择行和列 使用plots作图 使用现有的列创建新的列 进行统计 DF重组 简 ...

  7. pandas数组(pandas Series)-(4)NaN的处理

    上一篇pandas数组(pandas Series)-(3)向量化运算里说到,将两个 pandas Series 进行向量化运算的时候,如果某个 key 索引只在其中一个 Series 里出现,计算的 ...

  8. [Pandas]利用Pandas处理excel数据

    Python 处理excel的第三包有很多,比如XlsxWriter.xlrd&xlwt.OpenPyXL.Microsoft Excel API等,最后综合考虑选用了Pandas. Pand ...

  9. Pandas之:Pandas简洁教程

    Pandas之:Pandas简洁教程 目录 简介 对象创建 查看数据 选择数据 loc和iloc 布尔索引 处理缺失数据 合并 分组 简介 pandas是建立在Python编程语言之上的一种快速,强大 ...

随机推荐

  1. kafka基本概念和hello world搭建

    什么是kafka? Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据 ...

  2. FastJson将Java对象转换成json

    确保环境依赖都配置好! 1.在pom.xml导入依赖 <dependency> <groupId>com.alibaba</groupId> <artifac ...

  3. python常用模块-os

    得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir() 函数用来删除一个文件:os.remove() 删除多个目录 ...

  4. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(七)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  5. 安装allure测试报告

    必须安装jdk1.8,配置环境变量 一.环境准备 Windows10 jdk-9.0.1 二.下载并安装JDK 到Java的官网下载JDK安装包,地址:http://www.oracle.com/te ...

  6. VS Code WebApi系列——1、配置

    Knowledge should be Shared in Free. 最近在研究VS code下的webapi,看了很多文档,还是微软官方的例子好,不过不太适应国人习惯,所以写点东西. 直接了当 开 ...

  7. Git 居然可以用来跟女神聊天?

    Git 是用来做啥的?想必码农朋友都知道,Git 是版本控制软件,是软件开发过程中团队协作不可或缺的软件. 但是,作为版本控制软件的 Git ,能跟聊天工具扯上关系吗?这二者似乎毫无关系,但脑洞大开的 ...

  8. Java中堆栈的区别

    简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分 ...

  9. Linux操作篇之配置DNS服务(一)

    一.什么是DN. 域名(Domain Name)又称网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识(有时也指地理位置).它的作用只 ...

  10. 【String注解驱动开发】你了解@PostConstruct注解和@PreDestroy注解吗?

    写在前面 在之前的文章中,我们介绍了如何使用@Bean注解指定初始化和销毁的方法,小伙伴们可以参见<[Spring注解驱动开发]如何使用@Bean注解指定初始化和销毁的方法?看这一篇就够了!!& ...