【Python茴香豆系列】之 PANDAS 如何根据列的值来选取 DataFrame 的行
用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情。这让我想起鲁迅笔下的孔乙己。孔乙己对于茴香豆的茴字的四种写法颇有研究。我不敢自比孔乙己,这里搜集一些 Python 的茴香豆,以飨各位码农。
SELECT *
FROM table_name
WHERE column_name = value
上面的 SQL 语句可以用来在数据库中根据字段的值选取符合条件的记录,那么在 DataFrame 中如何根据列的值来选取行呢?
本文测试数据来源:https://raw.github.com/pandas-dev/pandas/master/pandas/tests/io/data/csv/tips.csv
>>> import pandas as pd
>>> import numpy as np
>>> df = pd.read_csv('tips.csv')
>>> df.head()total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
茴香豆一: []索引
最直观的方法是通过逻辑条件来筛选行。 在逻辑条件中,等于用 == ,不等于用 != ,还有 > 、 < 、 >= 和 <= 。 多个条件组合的情况下,与用 & , 或用| ,非用~ 。 是否在某个范围内用 isin 。 示例如下:
>>> mask = [False] * 244
>>> mask[1] = True
>>> mask[3] = True
>>> df[mask]total_bill tip sex smoker day time size
1 10.34 1.66 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2>>> # 选取性别为男性的行
>>> df[df['sex'] == 'Male'].head()total_bill tip sex smoker day time size
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
5 25.29 4.71 Male No Sun Dinner 4
6 8.77 2.00 Male No Sun Dinner 2>>> # 选取小费超过 2 ,或者性别为女性的行
>>> df[(df['tip']>2) | (df['sex']=='Female')].head()total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
5 25.29 4.71 Male No Sun Dinner 4
茴香豆二: 标签索引
标签索引接受布尔数组作为输入,所以使用行索引的标签可以筛选行。
>>> # 选取性别为男性的行
>>> df.loc[df['sex'] == 'Male'].head()total_bill tip sex smoker day time size
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
5 25.29 4.71 Male No Sun Dinner 4
6 8.77 2.00 Male No Sun Dinner 2>>> # 选取小费超过 2 ,或者性别为女性的行
>>> df.loc[(df['tip']>2) | (df['sex']=='Female')].head()total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
5 25.29 4.71 Male No Sun Dinner 4>>> # 选择不是周末,且小费大于 5 的行
>>> df.loc[~df['day'].isin(['Sun', 'Sat']) & (df['tip']>5)]total_bill tip sex smoker day time size
85 34.83 5.17 Female No Thur Lunch 4
88 24.71 5.85 Male No Thur Lunch 2
141 34.30 6.70 Male No Thur Lunch 6
茴香豆三: 位置索引
位置索引接受布尔数组作为输入,所以使用行索引的位置可以筛选行。
>>> mask = list(df['sex'] == 'Male')
>>> df.iloc[mask].head()total_bill tip sex smoker day time size
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
5 25.29 4.71 Male No Sun Dinner 4
6 8.77 2.00 Male No Sun Dinner 2
茴香豆四: 调用函数
以上三种索引都可以使用函数,函数你懂的。
>>> df[lambda df: df['tip']>5].head()total_bill tip sex smoker day time size
23 39.42 7.58 Male No Sat Dinner 4
44 30.40 5.60 Male No Sun Dinner 4
47 32.40 6.00 Male No Sun Dinner 4
52 34.81 5.20 Female No Sun Dinner 4
59 48.27 6.73 Male No Sat Dinner 4
茴香豆五: query
这个嘛,熟悉 SQL 的一定喜欢。
>>> # 选取小费超过 2 ,或者性别为女性的行
>>> df.query('tip>2 | sex=="Female"').head()total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
5 25.29 4.71 Male No Sun Dinner 4>>> # 选择不是周末,且小费大于 5 的行
>>> # @可以引用当前环境中的变量
>>> weekday = ['Sun', 'Sat']
>>> df.query('day not in @weekday & tip>5')total_bill tip sex smoker day time size
85 34.83 5.17 Female No Thur Lunch 4
88 24.71 5.85 Male No Thur Lunch 2
141 34.30 6.70 Male No Thur Lunch 6
茴香豆六: where
where 可以把不符合条件的变为 NaN,然后来一个 dropna 吧。
>>> df.where(df.tip>5).dropna().head()total_bill tip sex smoker day time size
23 39.42 7.58 Male No Sat Dinner 4.0
44 30.40 5.60 Male No Sun Dinner 4.0
47 32.40 6.00 Male No Sun Dinner 4.0
52 34.81 5.20 Female No Sun Dinner 4.0
59 48.27 6.73 Male No Sat Dinner 4.0
选择行的方法五花八门,这里只是列出一些关于单索引 DataFrame 的砖头而已,见笑了。详细的文档还是请移步:https://pandas.pydata.org/pandas-docs/stable/getting_started/index.html
【Python茴香豆系列】之 PANDAS 如何根据列的值来选取 DataFrame 的行相关推荐
- 【Python茴香豆系列】之 PANDAS 修改 DataFrame 列名
[Python茴香豆系列]之 PANDAS 修改 DataFrame 列名 用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于茴 ...
- 【Python茴香豆系列】之 PANDAS 获取 DataFrame 的行数
[Python茴香豆系列]之 PANDAS 获取 DataFrame 的行数 用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于 ...
- 【Python茴香豆系列】之 PANDAS 如何遍历 DataFrame 的所有行
[Python茴香豆系列]之 PANDAS 如何遍历 DataFrame 的所有行 用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙 ...
- 【Python茴香豆系列】之 拍扁列表
[Python茴香豆系列]之 拍扁列表 用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于茴香豆的茴字的四种写法颇有研究.我不敢 ...
- python的pandas库中如何计算每列出现最多的值_Python Pandas中根据列的值选取多行数据...
Pandas中根据列的值选取多行数据 # 选取等于某些值的行记录 用 == df.loc[df['column_name'] == some_value] # 选取某列是否是某一类型的数值 用 isi ...
- python选取列中数据的范围_Python Pandas中根据列的值选取多行数据
Pandas中根据列的值选取多行数据 # 选取等于某些值的行记录 用 == df.loc[df['column_name'] == some_value] # 选取某列是否是某一类型的数值 用 isi ...
- 【Python茴香豆系列】之 字典合并
[Python茴香豆系列]之 字典合并 用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于茴香豆的茴字的四种写法颇有研究.我不敢 ...
- python数据分析系列教程——Pandas全解
分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开 起步 Pandas最初被作为金融数据分析工具而开发出来,因此 pandas 为时间序列分析提 ...
- 【Python 实战基础】Pandas如何计算一列数字的中位数
目录 一.实战场景 二.主要知识点 文件读写 基础语法 Pandas numpy 三.菜鸟实战 1.创建 python 文件 2.运行结果 一.实战场景 实战场景:Pandas如何计算一列数字的中位数 ...
最新文章
- Angry Grammar Nazi
- 卷积学习与图像识别的技术发展
- 谈谈主机和存储连接的多路径技术
- Python 技术篇-利用pyqt5库读取剪切板已复制数据的格式类型实例演示,python判断复制文件的文件类型
- 如何更改已生成的APK的APP名字?
- *【HDU - 5711】Ingress(tsp旅行商问题,优先队列贪心,状压dp,floyd最短路,图论)
- Kafka集群部署CentOS 7
- eclipse集成python插件
- Xcode7 Xcode6 中添加pch文件
- pb实现简单计算器的思想_人教版初中数学七年级下册 用计算器求算数平方根、用有理数估计算数平方根的大小公开课优质课课件教案视频...
- java string转gbk_Java String UTF-8 和 GBK 互换
- paraview使用GUI连接服务器
- 三连杆机械臂正运动学python模拟——运动学学习(一)
- 深圳大学历届计算机文化节,第十二计算机文化节 | 与计算机应用能力大赛面对面...
- Android 电源键事件流程分析
- Connection Backoff Interop Test Descriptions
- kubernetes-----pod资源创建与Harbor私有仓库
- 怎么查看浪潮服务器型号,供应 浪潮服务器 各种型号
- matlab错误dparsfa,Dpabi安装出错,求助大大佬
- 骨传导原理是什么?骨传导耳机的利弊