Pandas.DataFrame.loc[ ] 筛选数据-标签法 详解 含代码 含测试数据集 随Pandas版本持续更新

这篇具有很好参考价值的文章主要介绍了Pandas.DataFrame.loc[ ] 筛选数据-标签法 详解 含代码 含测试数据集 随Pandas版本持续更新。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于Pandas版本: 本文基于 pandas2.2.0 编写。

关于本文内容更新: 随着pandas的stable版本更迭,本文持续更新,不断完善补充。

传送门: Pandas API参考目录

传送门: Pandas 版本更新及新特性

传送门: Pandas 由浅入深系列教程

Pandas.DataFrame.loc[]

Pandas.DataFrame.loc[] 方法用于通过索引、列名 筛选 DataFrame 数据。

  • 注意!在此方法中,你传递的数字,不会被理解为 自然索引,只作为字符串传递给 DataFrame.loc 视为行索引的值,或列名的值。
  • ⚠️ 注意 :

    • 在此方法中,你传递的数字,不会被理解为 自然索引,只作为字符串传递给 DataFrame.loc 视为行索引的值,或列名的值。
    • 如果对具有 多层索引DataFrame 进行范围筛选,必须先对其进行排序 推荐使用 df.sort_index(inplace=True)排序后再进行范围筛选。
    • 支持筛选后对原数据进行赋值 例10

语法:

DataFrame.loc [‘行索引’,‘列名’]

返回值:

  • Series or DataFrame or Scalar
    • 筛选范围、DataFrame 是否具有多层索引等都会影响具体的返回形式。
    • 如果筛选结果是 SeriesScalar 时,筛选条件套上 [ ] 方括号,可以强制以 DataFrame 样式返回。例1

语法说明:

1、筛选1行,筛选1列,筛选单元格

  • DataFrame.loc[索引,列名] 例1

    索引筛选条件、列名筛选条件,用英文逗号分隔。

    • 筛选1行: DataFrame.loc[‘索引’,: ] 只传递索引条件时,红色逗号、冒号可以省略。红色的冒号表示所有列。

    • 筛选1列: DataFrame.loc[:, ‘列名’] 红色冒号必须有,表示所有行。

    • 筛选单元格: DataFrame.loc[‘索引’, ‘列名’]

      如果 DataFrame 有多层索引、列名,当你想筛选非顶层数据时,需要用 元组 传递索引、列名的层级。例2

2、筛选多行,筛选多列

  • DataFrame.loc[[‘索引1’,‘索引2’, …],[‘列名1’,‘列名2’, …]]例3

    多个索引筛选条件用方括号包裹、多个列名筛选条件用方括号包裹。两种条件用英文逗号分隔。

    • 筛选多行: DataFrame.loc[[‘索引1’,‘索引2’, …], ] 只传递索引条件时,红色逗号可以省略。
    • 筛选多列: DataFrame.loc[, [‘列名1’,‘列名2’, …]]
    • 同时筛选多行多列: DataFrame.loc[[‘索引1’,‘索引2’, …], [‘列名1’,‘列名2’, …]]
    • ⚠️ 注意 :

      • 多个条件,必须用 [ ] 方括号包裹!

      • Python切片 不同,被 [ ] 包裹的开始和结束位置的元素,都会包含在筛选条件内。

      • 如果 DataFrame 有多层索引、列名,当你想筛选非顶层数据时,需要用 元组 传递索引、列名的层级。例4

3、范围筛选

  • DataFrame.loc[[‘索引1’:‘索引2’] 例5

    支持行的范围筛选,开始和结束的范围用英文冒号分隔。不支持列的范围筛选

    • 只筛选行范围: DataFrame.loc[[‘索引1’:‘索引2’], ] 只传递索引条件时,红色逗号可以省略。

    • 筛选行范围 + 筛选1列: DataFrame.loc[[‘索引1’:‘索引2’], ‘列名1’]

    • 筛选行范围 + 筛选多列: DataFrame.loc[[‘索引1’:‘索引2’], [‘列名1’,‘列名2’, …]]

    • ⚠️ 注意 :

      • 开始和结束的范围,必须用 : 英文冒号分隔!

      • 范围,必须用 [ ] 方括号包裹!

      • Python切片 不同,被 [ ] 包裹的范围,开始和结束位置,都会包含在筛选条件内。

    如果 DataFrame 有多层索引、列名,起始范围,必须精确到最底层的索引或列名。因为顶层索引、列名,可能代表着多行或多列,这是不能作为开始条件使用的。例6

    如果对具有 多层索引DataFrame 进行范围筛选,必须先对其进行排序 推荐使用 df.sort_index(inplace=True)排序后再进行范围筛选。

4、布尔筛选

  • DataFrame.loc[行条件,列条件]

    • 行筛选: 可以传递一个与行索引长度相同的 布尔列表 表示那些行留下,哪些行舍弃。例7
    • 行筛选: 可以使用布尔运算对行进行筛选。如果布尔运算的数量超过3个,建议使用 advanced indexing
    • ⚠️ 注意 :

      行的布尔运算,是通过列名完成的。以 df[列名] 的方式表达。 例8

      多个条件,可以用 &,| 表示并或,不能使用 andor例8

    • 列筛选: 不支持布尔运算。

5、Callable 筛选

  • DataFrame.loc[Callable]

    可以使用 Callable 进行筛选,原理上这也是一种布尔筛选。 例9

相关方法:

➡️ 相关方法


  • DataFrame.at

    Access a single value for a row/column label pair.

  • DataFrame.iloc

    筛选数据-自然索引法

  • DataFrame.xs

    Returns a cross-section (row(s) or column(s)) from the Series/DataFrame.

  • Series.loc

    Access group of values using labels.

示例:

测试文件下载:

本文所涉及的测试文件,如有需要,可在文章顶部的绑定资源处下载。

若发现文件无法下载,应该是资源包有内容更新,正在审核,请稍后再试。或站内私信作者索要。

read_excel_na_values
Pandas.DataFrame.loc[ ] 筛选数据-标签法 详解 含代码 含测试数据集 随Pandas版本持续更新,Pandas API参考,pandas


例1:只有单层索引的DataFrame,筛选单条数据

  • 1、筛选1行,默认返回 Series,把筛选条件套上 [ ],可以强制返回 DataFrame
import pandas as pd

# 构建DF
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['max_speed', 'shield'])

# 常规单行筛选,返回Series
df.loc['cobra']
# ... max_speed    1
# ... shield       2
# ... Name: cobra, dtype: int64


# 单行筛选,条件套上[ ],强制返回 DataFrame
df.loc[['cobra']]
# ...        max_speed  shield
# ... cobra          1       2
  • 2、筛选1列,默认返回 Series,把筛选条件套上 [ ],可以强制返回 DataFrame
# 常规单列筛选'max_speed',返回Series
df.loc[:,'max_speed']
# ... cobra         1
# ... viper         4
# ... sidewinder    7
# ... Name: max_speed, dtype: int64


# 单列筛选,条件套上[ ],强制返回 DataFrame
df.loc[:,['max_speed']]
# ...	        max_speed
# ... cobra	1
# ... viper	4
# ... sidewinder	7
  • 3、筛选单元格,默认返回标量值 Scalar,把筛选条件套上 [ ],可以强制返回 DataFrame
# 常规单元格筛选,返回标量值
df.loc['cobra', 'max_speed']
# ... 1


# 把筛选条件套上 [ ],可以强制返回 DataFrame
df.loc[['cobra'], ['max_speed']]
# ... 	    max_speed
# ... cobra	    1


例2:多层索引的DataFrame,筛选数据

  • 1、构建演示数据并观察数据内容
import pandas as pd

# 构建演示数据
tuples = [
   ('射手', '巨魔族'), ('射手', '死灵族'),
   ('法师', '巨魔族'), ('法师', '死灵族'),
   ('战士', '巨魔族'), ('战士', '死灵族')
]
index = pd.MultiIndex.from_tuples(tuples)
values = [[9, 20], [10, 18], [7, 23],
        [6, 25], [4, 30], [3, 35]]
df = pd.DataFrame(values, columns=[['属性1','属性2'], ['攻速','攻击力']], index=index)

# 观察数据内容
df
  • 2、筛选1行或1列顶层索引,正常传递条件即可
# 筛选顶层行索引
df.loc['射手']
# ...        属性1	 属性2
# ...        攻速	攻击力
# ... 巨魔族	    9	   20
# ... 死灵族	   10	   18

# 筛选顶层列索引
df.loc[:,'属性1']
# ... 		        攻速
# ... 射手	巨魔族	   9
# ...       死灵族	  10
# ... 法师	巨魔族	   7
# ...       死灵族	   6
# ... 战士	巨魔族	   4
# ...       死灵族	   3
  • 2、筛选非顶层索引、列名,需要用元组把条件套起来
# 筛选最底层的某行
df.loc[('射手','巨魔族')]
# ... 属性1  攻速      9
# ... 属性2  攻击力    20
# ... Name: (射手, 巨魔族), dtype: int64

# 筛选底层索引,顶层列名
df.loc[('射手','巨魔族'),'属性1']
# ... 攻速    9
# ... Name: (射手, 巨魔族), dtype: int64

# 筛选底层索引,底层列名
df.loc[('射手','巨魔族'),('属性1','攻速')]
# ... 9
9
  • 3、多层索引筛选,条件用 [] 套起来,也可以强制返回DataFrame
df.loc[[('射手','巨魔族')],['属性1']]
# ... 		       属性1
# ...              攻速
# ... 射手	巨魔族	 9


例3:单层索引的DataFrame,筛选多条数据

import pandas as pd

# 构建DF
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['max_speed', 'shield'])

# 筛选多行
df.loc[['cobra', 'viper']]
# ... 	    max_speed	shield
# ... cobra	        1	     2
# ... viper	        4	     5


# 筛选多行、单列
df.loc[['cobra', 'viper'],'max_speed']
# ... cobra    1
# ... viper    4
# ... Name: max_speed, dtype: int64


# 筛选多行、多列
df.loc[['cobra', 'viper'],['max_speed', 'shield']]
# ... 	     max_speed	shield
# ... cobra	         1	     2
# ... viper	         4	     5


例4:多层索引的DataFrame,筛选多条数据

import pandas as pd

# 构建演示数据
tuples = [
   ('射手', '巨魔族'), ('射手', '死灵族'),
   ('法师', '巨魔族'), ('法师', '死灵族'),
   ('战士', '巨魔族'), ('战士', '死灵族')
]
index = pd.MultiIndex.from_tuples(tuples)
values = [[9, 20], [10, 18], [7, 23],
        [6, 25], [4, 30], [3, 35]]
df = pd.DataFrame(values, columns=[['属性1','属性2'], ['攻速','攻击力']], index=index)



# 筛选多个顶层行索引
df.loc[['射手','法师']]
# ... 	            属性1	属性2
# ...               攻速	攻击力
# ... 射手	巨魔族	   9	   20
# ...       死灵族	  10	   18
# ... 法师	巨魔族	   7	   23
# ...       死灵族	   6	   25


# 筛选多个底层航索引
df.loc[[('射手','巨魔族'),('法师','死灵族')]]
# ... 		       属性1	属性2
# ...               攻速	攻击力
# ... 射手	巨魔族	   9	   20
# ... 法师	死灵族	   6	   25


# 行、列组合条件
df.loc[('射手','巨魔族'),('属性2','攻击力')]
# ... 20

# 同时筛选多行、多列
df.loc[[('射手','巨魔族'),('法师','死灵族')],[('属性1','攻速'),('属性2','攻击力')]]
# ... 	           属性1	属性2
# ...              攻速	   攻击力
# ... 射手	巨魔族	  9	      20
# ... 法师	死灵族	  6	      25


例5:单层索引的DataFrame,筛选行范围

import pandas as pd

# 构建DF
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['max_speed', 'shield'])


# 只筛选行的范围
df.loc['viper':'sidewinder']
# ...  	        max_speed	shield
# ... viper	            4	     5
# ... sidewinder	    7	     8


# 行范围 + 1列
df.loc['viper':'sidewinder','shield']
# ... viper         5
# ... sidewinder    8
# ... Name: shield, dtype: int64


# 行范围 + 多列
df.loc['viper':'sidewinder',['max_speed','shield']]
# ... 	          max_speed	shield
# ... viper	              4	     5
# ... sidewinder	      7	     8


例6:多层索引的DataFrame,筛选行范围 起始范围,必须精确到最底层的索引或列名。

import pandas as pd

# 构建演示数据
tuples = [
   ('射手', '巨魔族'), ('射手', '死灵族'),
   ('战士', '巨魔族'), ('战士', '死灵族'),
   ('法师', '巨魔族'), ('法师', '死灵族')
]
index = pd.MultiIndex.from_tuples(tuples)
values = [[9, 20], [10, 18], [7, 23],
        [6, 25], [4, 30], [3, 35]]
df = pd.DataFrame(values, columns=[['属性1','属性2'], ['攻速','攻击力']], index=index)

# 观察数据
# df
#                属性1	属性2
#                攻速	攻击力
# 射手	巨魔族	    9	   20
#       死灵族	   10	   18
# 战士	巨魔族	    4	   30
#       死灵族	    3	   35
# 法师	巨魔族	    7	   23
#       死灵族	    6	   25


# 筛选从射手到法师,即使都是顶层索引,范围条件的开始位置,也必须精确到巨魔族,意为指定这一行。因为顶层索引、列名,可能代表着多行或多列,这是不能作为开始条件使用的。
df.loc[('射手','巨魔族'):'战士']
#                属性1	属性2
#                攻速	攻击力
# 射手	巨魔族	    9	   20
#       死灵族	   10	   18
# 战士	巨魔族	    4	   30
#       死灵族	    3	   35

# 筛选行范围 + 列范围
df.loc[('射手','巨魔族'):('战士', '巨魔族'),('属性1','攻速'):('属性2', '攻击力')]
#                属性1	属性2
#                攻速	攻击力
# 射手	巨魔族	    9	   20
#       死灵族	   10	   18
# 战士	巨魔族	    4	   30


示例7:传递布尔列表,表示哪些行留下

import pandas as pd

# 构建演示数据
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['max_speed', 'shield'])

# 布尔列表
list_bool = [False, False, True]

# 传入布尔列表,只保留第3行'sidewinder'
df.loc[list_bool]
# ...             max_speed	shield
# ... sidewinder	      7	     8


示例8:用布尔运算筛选行

import pandas as pd

# 构建演示数据
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['移速', '护甲'])

# 筛选 '移速列' > 6 的行
df.loc[df['移速'] > 6]
# ... 	          移速	护甲
# ... sidewinder	7	  8


# 筛选 '移速列' > 6 的行,同时,只保留护甲列
df.loc[df['移速'] > 6,['护甲']]  # 护甲加了方括号,是为了以DataFrame显示。
# ... 	          护甲
# ... sidewinder	8


# 用  & 表示 并
df.loc[(df['移速'] > 1) & (df['护甲'] < 8)]
# ... 	    移速  护甲
# ... viper	  4	    5


# 用 | 表示 或
df.loc[(df['移速'] > 4) | (df['护甲'] < 5)]
# ...            移速	护甲
# ... cobra	       1	  2
# ... sidewinder   7	  8


示例9:使用 Callable 进行筛选

  • 1、lambda
import pandas as pd

# 构建演示数据
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['移速', '护甲'])

# 使用lambda 筛选 护甲列 ==8 的行
df.loc[lambda df: df['护甲'] == 8]

# ...       	  移速	护甲
# ... sidewinder	7	  8
  • 2、自定义函数
import pandas as pd

# 构建演示数据
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['移速', '护甲'])

# 定义筛选函数
def slect_df(df):
    return df['护甲'] == 8


# 调用函数
df.loc[slect_df]


示例10:筛选后赋值,更改数据内容文章来源地址https://www.toymoban.com/news/detail-805789.html

import pandas as pd

# 构建演示数据
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['移速', '护甲'])

# 筛选后,批量修改数据
df.loc[df['移速']>2] = 50
df
# ...             移速	护甲
# ... cobra	         1	  2
# ... viper	        50	  50
# ... sidewinder	50	  50


# 筛选后,批量 + 30
df.loc[df['移速'] == 50] += 5
df
# ...             移速	护甲
# ... cobra	         1	  2
# ... viper	        55	  55
# ... sidewinder	55	  55

到了这里,关于Pandas.DataFrame.loc[ ] 筛选数据-标签法 详解 含代码 含测试数据集 随Pandas版本持续更新的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Pandas 数据分析系列1--Series&DataFrame数据结构详解

       P andas 是一个开源的数据分析和数据处理库,是基于 NumPy 开发的。它提供了灵活且高效的数据结构,使得处理和分析结构化、缺失和时间序列数据变得更加容易。其在数据分析和数据处理领域广泛应用,在金融、社交媒体、科学研究等领域都有很高的使用率和广泛的应用

    2024年02月08日
    浏览(41)
  • 筛选特定内容:Python中筛选DataFrame指定数据列包含特定内容的所有数据行

    筛选特定内容:Python中筛选DataFrame指定数据列包含特定内容的所有数据行 在数据处理和分析中,经常需要对数据进行筛选以便找到我们需要的信息。而在Python中,使用Pandas库中的DataFrame对象可以方便地对数据进行处理和分析。 下面我们来看如何使用contains()函数,筛选DataFr

    2024年02月14日
    浏览(39)
  • Pandas数据选取中df[]、df.loc[]、df.iloc[]、df.at[]、df.iat[]的区别及用法

    Pandas是作为Python数据分析著名的工具包,提供了多种数据选取的方法,方便实用。本文主要介绍Pandas的几种数据选取的方法。 Pandas中,数据主要保存为Dataframe和Series是数据结构,这两种数据结构数据选取的方式基本一致,本文主要以Dataframe为例进行介绍。 在Dataframe中选取数

    2023年04月22日
    浏览(50)
  • 【玩转pandas系列】pandas数据结构—DataFrame

    大家好!我是一朵向阳花(花花花)🍭,本期跟大家分享的知识是 pandas 数据结构——DataFrame。 作者的【 Python 数据分析】专栏正在火热更新中🔥,如果本文对您有帮助,欢迎大家点赞 + 评论 + 收藏 ! 每日金句分享: 慢慢来,谁还没有一个努力的过程。』—— pony「网易云

    2024年02月15日
    浏览(35)
  • Pandas DataFrame如何添加一行数据?

    在Pandas DataFrame中,我们经常需要添加新的行数据。这里介绍几种向DataFrame中添加一行数据的方法。 1. 使用.loc索引器 .loc索引器可以在DataFrame的尾部添加一条新行数据,语法如下: 例如: 2. 使用.append()方法 .append()方法可以向DataFrame尾部追加一行数据,语法如下: 例如: 3. 使用insert方

    2024年02月12日
    浏览(42)
  • pandas中DataFrame数据合并、连接

    为解决数据冗余等问题,大量的数据会分开存放在不同的文件(表格)里。在数据处理时,经常会有不同表格的数据需要进行合并操作。可以通过pandas库的 merge函数 和 concat函数 来实现数据集的合并。 根据 一个或多个键 将不同DataFrame中的 行 连接起来。 说明:类似于关系数

    2024年02月15日
    浏览(43)
  • 【数据分析 - 基础入门之pandas篇③】- pandas数据结构——DataFrame

    大家好!我是一朵向阳花(花花花)🍭,本期跟大家分享的知识是 pandas 数据结构——DataFrame。 作者的【 Python 数据分析】专栏正在火热更新中🔥,如果本文对您有帮助,欢迎大家点赞 + 评论 + 收藏 ! 每日金句分享: 慢慢来,谁还没有一个努力的过程。』—— pony「网易云

    2024年02月16日
    浏览(44)
  • Pandas 筛选数据的 8 个神操作

    日常用 Python 做数据分析最常用到的就是查询筛选了,按各种条件、各种维度以及组合挑出我们想要的数据,以方便我们分析挖掘。 今天我给大家总结了日常查询和筛选常用的种骚操作,供各位学习参考。本文采用 sklearn 的 boston 数据举例介绍。 喜欢本文记得收藏、关注、点

    2024年02月02日
    浏览(39)
  • pandas 筛选数据的 8 个骚操作

    日常用 Python 做数据分析最常用到的就是查询筛选了,按各种条件、各种维度以及组合挑出我们想要的数据,以方便我们分析挖掘。 东哥总结了日常查询和筛选常用的种骚操作,供各位学习参考。本文采用 sklearn 的 boston 数据举例介绍。 第一种是最快捷方便的,直接在datafr

    2024年02月09日
    浏览(38)
  • python中Pandas之DataFrame索引、选取数据

    总结一下 DataFrame 索引问题 先创建一个简单的 DataFrame 。 DataFrame 中有两种索引: 行索引( index ):对应最左边那一竖列 列索引( columns ):对应最上面那一横行 两种索引默认均为从 0 开始的自增整数。 可以使用 index 这个参数指定行索引, columns 这个参数指定列索引。 输出此时

    2023年04月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包