用 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 的行相关推荐

  1. 【Python茴香豆系列】之 PANDAS 修改 DataFrame 列名

    [Python茴香豆系列]之 PANDAS 修改 DataFrame 列名 用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于茴 ...

  2. 【Python茴香豆系列】之 PANDAS 获取 DataFrame 的行数

    [Python茴香豆系列]之 PANDAS 获取 DataFrame 的行数 用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于 ...

  3. 【Python茴香豆系列】之 PANDAS 如何遍历 DataFrame 的所有行

    [Python茴香豆系列]之 PANDAS 如何遍历 DataFrame 的所有行 用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙 ...

  4. 【Python茴香豆系列】之 拍扁列表

    [Python茴香豆系列]之 拍扁列表 用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于茴香豆的茴字的四种写法颇有研究.我不敢 ...

  5. python的pandas库中如何计算每列出现最多的值_Python Pandas中根据列的值选取多行数据...

    Pandas中根据列的值选取多行数据 # 选取等于某些值的行记录 用 == df.loc[df['column_name'] == some_value] # 选取某列是否是某一类型的数值 用 isi ...

  6. python选取列中数据的范围_Python Pandas中根据列的值选取多行数据

    Pandas中根据列的值选取多行数据 # 选取等于某些值的行记录 用 == df.loc[df['column_name'] == some_value] # 选取某列是否是某一类型的数值 用 isi ...

  7. 【Python茴香豆系列】之 字典合并

    [Python茴香豆系列]之 字典合并 用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于茴香豆的茴字的四种写法颇有研究.我不敢 ...

  8. python数据分析系列教程——Pandas全解

    分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开 起步 Pandas最初被作为金融数据分析工具而开发出来,因此 pandas 为时间序列分析提 ...

  9. 【Python 实战基础】Pandas如何计算一列数字的中位数

    目录 一.实战场景 二.主要知识点 文件读写 基础语法 Pandas numpy 三.菜鸟实战 1.创建 python 文件 2.运行结果 一.实战场景 实战场景:Pandas如何计算一列数字的中位数 ...

最新文章

  1. Angry Grammar Nazi
  2. 卷积学习与图像识别的技术发展
  3. 谈谈主机和存储连接的多路径技术
  4. Python 技术篇-利用pyqt5库读取剪切板已复制数据的格式类型实例演示,python判断复制文件的文件类型
  5. 如何更改已生成的APK的APP名字?
  6. *【HDU - 5711】Ingress(tsp旅行商问题,优先队列贪心,状压dp,floyd最短路,图论)
  7. Kafka集群部署CentOS 7
  8. eclipse集成python插件
  9. Xcode7 Xcode6 中添加pch文件
  10. pb实现简单计算器的思想_人教版初中数学七年级下册 用计算器求算数平方根、用有理数估计算数平方根的大小公开课优质课课件教案视频...
  11. java string转gbk_Java String UTF-8 和 GBK 互换
  12. paraview使用GUI连接服务器
  13. 三连杆机械臂正运动学python模拟——运动学学习(一)
  14. 深圳大学历届计算机文化节,第十二计算机文化节 | 与计算机应用能力大赛面对面...
  15. Android 电源键事件流程分析
  16. Connection Backoff Interop Test Descriptions
  17. kubernetes-----pod资源创建与Harbor私有仓库
  18. 怎么查看浪潮服务器型号,供应 浪潮服务器 各种型号
  19. matlab错误dparsfa,Dpabi安装出错,求助大大佬
  20. 骨传导原理是什么?骨传导耳机的利弊

热门文章

  1. 2022年全球市场超宽带电容器总体规模、主要生产商、主要地区、产品和应用细分研究报告
  2. Timed out after 30000 ms while waiting to connect
  3. Linux v4l2框架分析
  4. 有关调音台的专业英文词汇
  5. XCP实战系列介绍10-基于CANoe实现XCP测量功能详细介绍
  6. Oracle修改用户密码引发的问题
  7. STC32G12K128-Beta 硬件USB直接ISP下载
  8. mondrian mysql 实例_mondrian入门 | 学步园
  9. 8.GDAL数据集总体概览
  10. 机器学习算法基本过程与优缺点总结