pandas 选取行和列数据的方法详解


Posted in Python onAugust 08, 2019

前言

本文介绍在 pandas 中如何读取数据行列的方法。数据由行和列组成,在数据库中,一般行被称作记录 (record),列被称作字段 (field)。回顾一下我们对记录和字段的获取方式:一般情况下,字段根据名称获取,记录根据筛选条件获取。比如获取 student_id 和 studnent_name 两个字段;记录筛选,比如 sales_amount 大于 10000 的所有记录。对于熟悉 SQL 语句的人来说,就是下面的语句:

select student_id, student_name
from exam_scores
where chinese >= 90 and math >= 90

上面的 SQL 语句表示从考试成绩表 (exam_scores) 中,筛选出语文和数学都大于或等于 90 分的所有学生 id 和 name。学习 pandas 数据获取,推荐这种以数据处理的目标为导向的方式,而不是被动的按 pandas 提供的 loc, iloc的语法中,一条条顺序学习。

本篇我们要分析的关于销售数量和金额的一组数据,数据存放在 csv 文件中。示例数据我在 github 上放了一份,方便大家对照练习。

pandas 选取行和列数据的方法详解

选择列

以下两种方法返回 Series 类型:

import pandas as pd
df = pd.read_csv('sample-salesv3.csv')
df.name
# 或者
df['name']

如果需要返回 DataFrame 格式,使用 list 作为参数。为了方便说明,给出在 jupyter notebook 中显示的界面。

pandas 选取行和列数据的方法详解

如果需要选取多列,传给 DataFrame 一个包含列名的 list:

pandas 选取行和列数据的方法详解

选择行

假设我们要筛选 quantity < 0 的所有记录:

pandas 选取行和列数据的方法详解

按多条件筛选的处理方式。假设想筛选 quantity < 0 并且 unit price > 50 的所有记录:

pandas 选取行和列数据的方法详解

代码:

criteria = (df['quantity'] < 0) & (df['unit price'] > 50)
df[criteria].head()

在 pandas 中,AND 条件的运算符为 & ,OR 条件的运算符为 |。假设想筛选所有 quantity > 30 或 unit price > 50 的记录:

pandas 选取行和列数据的方法详解

代码:

criteria = (df['quantity'] > 30) | (df['unit price'] > 50)
df[criteria].head()

基于字符串的记录筛选

如果筛选条件为基于字符串,可以使用用 Series.str.xxx 方法,主要有 startswith, endswith 和 contains等。举一个例子,筛选出所有 name 含有 White 的记录:

pandas 选取行和列数据的方法详解

代码:

criteria = df['name'].str.contains('White')
df[criteria].head()

这里解释一下 pandas 布尔索引 (boolean indexing) 的概念。布尔索引的意思是首先构建一个与 DataFrame 的 index 长度相同的一个 boolean 向量 (boolean vector),这个向量中只包含 True 或者 False,布尔索引是一个 Series。

然后 DataFrame 在筛选的时候,基于 DataFrame 的行索引,当布尔索引相同行索引所在行的 value 为 True 时,DataFrame 的这一行就包含在筛选之中,否则就排除在外。

为了能看得更加清晰,我们把上面的例子用另外一个方法来展示。创建一个新列:is_selected,这一列是一个布尔索引。

df['is_selected'] = df['name'].str.contains('White')

我们看到,is_selected 由 True 和 False 构成。

pandas 选取行和列数据的方法详解

构建了 is_selected 列之后,通过df[df['name'].str.contains('White')] 筛选与下面的语句作用相同:

df[df['is_selected'] == True]

可以把 df['name'].str.contains('White') 这个布尔索引理解为构建了一个新列,然后基于这一列进行筛选。

基于 DateTime 类型的记录筛选

如果列的类型是 DateTime 类型,比如本示例的 date 列。pandas 读取 csv 文件时,date 列是 str 类型,所以我们先将 date 列转换成 datetime 类型,然后基于 pandas 的 Timestamp 类型构建筛选条件。

# 将 date 列转换成 datetime 类型
df['date'] = pd.to_datetime(df['date'])

# 筛选条件为日期大于 2014/4/1
criteria = df['date'] > pd.Timestamp(2014,4,1)
df[criteria].head()

pandas 选取行和列数据的方法详解

同时选择行和列

如果基于本篇所说的模式,同时选择行和列,最简单的方法是组合,比如先基于行构建 DataFrame,然后再基于这个 DataFrame 选取需要的列:

where = df['name'].str.contains('White')
cols = ['name', 'quantity', 'unit price', 'ext price']
df[where][cols].head()

pandas 选取行和列数据的方法详解

参考

Comparison with SQL

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
利用Python开发微信支付的注意事项
Aug 19 Python
深入理解Django的中间件middleware
Mar 14 Python
python实现将一个数组逆序输出的方法
Jun 25 Python
对numpy中二进制格式的数据存储与读取方法详解
Nov 01 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
Jul 31 Python
python二维键值数组生成转json的例子
Dec 06 Python
如何基于Python + requests实现发送HTTP请求
Jan 13 Python
python实现在内存中读写str和二进制数据代码
Apr 24 Python
PyQt5多线程防卡死和多窗口用法的实现
Sep 15 Python
python 实现弹球游戏的示例代码
Nov 17 Python
一篇文章搞懂python混乱的切换操作与优雅的推导式
Aug 23 Python
Python中time标准库的使用教程
Apr 13 Python
pandas 对日期类型数据的处理方法详解
Aug 08 #Python
解决Python设置函数调用超时,进程卡住的问题
Aug 08 #Python
Python 根据日志级别打印不同颜色的日志的方法示例
Aug 08 #Python
Python学习笔记之错误和异常及访问错误消息详解
Aug 08 #Python
Python实现直方图均衡基本原理解析
Aug 08 #Python
python获取指定日期范围内的每一天,每个月,每季度的方法
Aug 08 #Python
Python 调用 Outlook 发送邮件过程解析
Aug 08 #Python
You might like
PHP自动更新新闻DIY
2006/10/09 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
thinkPHP中U方法加密传递参数功能示例
2018/05/29 PHP
PHP函数按引用传递参数及函数可选参数用法示例
2018/06/04 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
JScript中的&quot;this&quot;关键字使用方式补充材料
2007/03/08 Javascript
小议Javascript中的this指针
2010/03/18 Javascript
标题过长使用javascript按字节截取字符串
2014/04/24 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
JavaScript分页功能的实现方法
2015/04/25 Javascript
JAVA Web实时消息后台服务器推送技术---GoEasy
2016/11/04 Javascript
微信小程序模板之分页滑动栏
2017/02/10 Javascript
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
2017/03/04 Javascript
百度地图JavascriptApi Marker平滑移动及车头指向行径方向
2017/03/13 Javascript
手机注册发送验证码倒计时的简单实例
2017/11/15 Javascript
VUE基于NUXT的SSR 服务端渲染
2018/11/30 Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
2018/12/10 Javascript
echarts实现词云自定义形状的示例代码
2019/02/20 Javascript
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
使用Python读写及压缩和解压缩文件的示例
2016/07/08 Python
详解如何将python3.6软件的py文件打包成exe程序
2018/10/09 Python
解决Python pandas plot输出图形中显示中文乱码问题
2018/12/12 Python
解决运行出现'dict' object has no attribute 'has_key'问题
2020/07/15 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
瑞贝卡·明可弗包包官网:Rebecca Minkoff
2016/07/21 全球购物
去加拿大的旅行和假期:Canadian Affair
2016/10/25 全球购物
标准导师推荐信(医学类)
2013/10/28 职场文书
会计工作决心书
2014/03/11 职场文书
教师对学生的寄语
2014/04/03 职场文书
感恩小明星事迹材料
2014/05/23 职场文书
工地质量标语
2014/06/12 职场文书
中药学专业毕业生推荐信
2014/07/10 职场文书
平遥古城导游词
2015/02/03 职场文书
年终奖金发放管理制度,中小企业适用,拿去救急吧!
2019/07/12 职场文书
html5实现点击弹出图片功能
2021/07/16 HTML / CSS
python实现学员管理系统(面向对象版)
2022/06/05 Python