在 Pandas 中使用 loc 和 MultiIndex DataFrame

2023-10-19

在之前的教程中,我们讨论了locproperty,一种基于标签的数据选择方法。

但是您是否知道在使用 loc 处理多级索引时可以优化您的选择?

本教程将揭示在 Pandas 中使用 loc 和 MultiIndex DataFrame 的强大功能。

 

 

loc 与 MultiIndex 的基本用法

让我们首先导入必要的库并创建一些示例数据。


import pandas as pd
import numpy as np

# Set a random seed for reproducibility
np.random.seed(0)

# Create a MultiIndex DataFrame
index = pd.MultiIndex.from_tuples([(i, j) for i in range(5) for j in range(5)])
df = pd.DataFrame(np.random.rand(25, 2), index=index)
df.columns = ['A', 'B']
print(df)  

Output:


            A         B
0 0  0.548814  0.715189
  1  0.602763  0.544883
  2  0.423655  0.645894
  3  0.437587  0.891773
  4  0.963663  0.383442
1 0  0.791725  0.528895
  1  0.568045  0.925597
  2  0.071036  0.087129
  3  0.020218  0.832620
  4  0.778157  0.870012
2 0  0.978618  0.799159
  1  0.461479  0.780529
  2  0.118274  0.639921
  3  0.143353  0.944669
  4  0.521848  0.414662
3 0  0.264556  0.774234
  1  0.456150  0.568434
  2  0.018790  0.617635
  3  0.612096  0.616934
  4  0.943748  0.681820
4 0  0.359508  0.437032
  1  0.697631  0.060225
  2  0.666767  0.670638
  3  0.210383  0.128926
  4  0.315428  0.363711
  

让我们看看如何loc函数在处理 MultiIndexed DataFrame 时有效:


# Accessing a single row with loc
print(df.loc[(1, 3)])

# Accessing multiple rows
print(df.loc[[(1, 3), (2, 2)]])
  

Output:


A    0.020218
B    0.832620
Name: (1, 3), dtype: float64

            A         B
1 3  0.020218  0.832620
2 2  0.118274  0.639921  

在第一个示例中,您使用元组对 DataFrame 进行索引:(1, 3).

这表示您希望第一级中索引为 1 的行和第二级中索引为 3 的行。输出是包含指定行数据的系列。

在第二个示例中,我们向 loc 属性提供一个元组列表,每个元组表示 DataFrame 中的不同行。

 

从多个级别选择所有行

让我们看看如何从多个级别选择所有行:


# Select all rows in level 1 with index 2 and level 2 with index 1
print(df.loc[(2, 1),])  

Output:


A    0.461479
B    0.780529
Name: (2, 1), dtype: float64  

当我们提供(2, 1)作为loc的key,它返回对应的行数据。这,(逗号)代表其他级别的所有元素。

So with (2, 1),,我们选择一级索引为 2 且二级索引为 1 的所有行。

让我们更进一步,利用 Pandas 中的切片操作。


# Select all rows where level 1 index is between 2 and 4
print(df.loc[(slice(2, 4), slice(None)), ])  

Output:


            A         B
2 0  0.978618  0.799159
  1  0.461479  0.780529
  2  0.118274  0.639921
  3  0.143353  0.944669
  4  0.521848  0.414662
3 0  0.264556  0.774234
  1  0.456150  0.568434
  2  0.018790  0.617635
  3  0.612096  0.616934
  4  0.943748  0.681820
4 0  0.359508  0.437032
  1  0.697631  0.060225
  2  0.666767  0.670638
  3  0.210383  0.128926
  4  0.315428  0.363711
  

在这里,我们使用切片对象来定义选择范围。这将显示第一级索引介于 2 和 4 之间(含 2 和 4)的数据。

更远,slice(None)告诉 Pandas 选择第二层中的所有行。

 

根据值选择数据

如果您想根据值选择数据怎么办?

让我们看看如何做到这一点:


# Select rows where A > 0.5
df_A = df.loc[df['A'] > 0.5]
print(df_A)  

Output:


            A         B
0 0  0.548814  0.715189
  1  0.602763  0.544883
  4  0.963663  0.383442
1 0  0.791725  0.528895
  1  0.568045  0.925597
  4  0.778157  0.870012
2 0  0.978618  0.799159
  4  0.521848  0.414662
3 3  0.612096  0.616934
  4  0.943748  0.681820
4 1  0.697631  0.060225
  2  0.666767  0.670638  

输出数据帧,df_A,包括 A 列中的值大于 0.5 的所有行。

我们还可以添加多个条件:


# Loc to select rows where A > 0.5 and B < 0.3
df_AB = df.loc[(df['A'] > 0.5) & (df['B'] < 0.3)]
print(df_AB)  

Output:


            A         B
4 1  0.697631  0.060225  

当我们添加另一个条件时,选择会变得更加精确。现在,df_AB包括 A 列 > 0.5 且 B 列

可以使用“&”(与)或“|”(或)运算符组合多个条件。

 

从排序的多索引数据框中选择数据

如果 DataFrame 未排序,您可能会遇到不可预测的结果或错误。以下是对 MultiIndex DataFrame 进行排序的方法:


# Sort the DataFrame
df_sorted = df.sort_index()
print(df_sorted)  

数据框df_sorted是按照索引排序的。

当DataFrame排序后,可以使用loc进行基于标签的切片操作:


# Select all rows where the first level index is between 2 and 4
df_sorted_range = df_sorted.loc[(slice(2, 4), slice(None)), ]
print(df_sorted_range)  

Output:


            A         B
2 0  0.978618  0.799159
  1  0.461479  0.780529
  2  0.118274  0.639921
  3  0.143353  0.944669
  4  0.521848  0.414662
3 0  0.264556  0.774234
  1  0.456150  0.568434
  2  0.018790  0.617635
  3  0.612096  0.616934
  4  0.943748  0.681820
4 0  0.359508  0.437032
  1  0.697631  0.060225
  2  0.666767  0.670638
  3  0.210383  0.128926
  4  0.315428  0.363711
  

在这种情况下,df_sorted_range由第一级索引介于 2 和 4 之间(含 2 和 4)的行组成,类似于前面的示例。

 

在指数级别应用布尔条件

基于上面排序的 DataFrame,让我们看看如何在索引级别应用布尔条件:


# Select all rows with first-level index > 1 and second-level index < 3
df_bool_index = df_sorted.loc[(df_sorted.index.get_level_values(0) > 1) & 
                              (df_sorted.index.get_level_values(1) < 3)]
print(df_bool_index)  

Output:


            A         B
2 0  0.978618  0.799159
  1  0.461479  0.780529
  2  0.118274  0.639921
3 0  0.264556  0.774234
  1  0.456150  0.568434
  2  0.018790  0.617635
4 0  0.359508  0.437032
  1  0.697631  0.060225
  2  0.666767  0.670638
  

在这个例子中,该方法get_level_values(0) and get_level_values(1)分别用于访问第一和第二索引级别的值。

所结果的df_bool_index包含一级索引大于 1 且二级索引小于 3 的行。

 

使用 MultiIndex 将值分配给特定索引

您可以使用 loc 根据条件设置所有 DataFrame 值,或精确选择特定索引:


# Assign a value for a specific index
df_sorted.loc[(1, 3), 'A'] = 0.999
print(df_sorted.loc[(1, 3)])  

Output:


A    0.99900
B    0.83262
Name: (1, 3), dtype: float64  

我们使用 loc 设置索引处“A”列的值(1, 3)至 0.999。

您还可以为一系列索引级别分配值,如下所示:


# Assign a value for a range of index level
df_sorted.loc[(slice(2, 4), slice(None)), 'A'] = 0.123
print(df_sorted.loc[(slice(2, 4), slice(None)), ])  

Output:


         A         B
2 0  0.123  0.799159
  1  0.123  0.780529
  2  0.123  0.639921
  3  0.123  0.944669
  4  0.123  0.414662
3 0  0.123  0.774234
  1  0.123  0.568434
  2  0.123  0.617635
  3  0.123  0.616934
  4  0.123  0.681820
4 0  0.123  0.437032
  1  0.123  0.060225
  2  0.123  0.670638
  3  0.123  0.128926
  4  0.123  0.363711
  

在此示例中,我们将第一级索引在 2 到 4 之间的列“A”的所有值设置为 0.123。

输出中对应于指定索引范围的每个 A 值现在反映了我们新分配的值。

 

从多索引数据框中选择行和列

您可以使用loc从多索引数据框中同时选择行和列中的数据。


# Select specific rows and columns
df_row_col = df_sorted.loc[(slice(None), slice(1, 3)), 'B']
print(df_row_col)  

Output:


0  1    0.544883
   2    0.645894
   3    0.891773
1  1    0.925597
   2    0.087129
   3    0.832620
2  1    0.780529
   2    0.639921
   3    0.944669
3  1    0.568434
   2    0.617635
   3    0.616934
4  1    0.060225
   2    0.670638
   3    0.128926
Name: B, dtype: float64  

对于行选择,slice(None)选择第一个索引级别中的所有行,并且slice(1, 3)选择第二级索引介于 1 和 3 之间(含 1 和 3)的行。

我们还选择了“B”列,这会产生一个系列。

您可以像这样选择多个列:


# Select all rows for multiple columns
df_multi_col = df_sorted.loc[(slice(None), slice(None)), ['A', 'B']]
print(df_multi_col)  

Output:


            A         B
0 0  0.548814  0.715189
  1  0.602763  0.544883
  2  0.423655  0.645894
  3  0.437587  0.891773
  4  0.963663  0.383442
1 0  0.791725  0.528895
  1  0.568045  0.925597
  2  0.071036  0.087129
  3  0.020218  0.832620
  4  0.778157  0.870012
2 0  0.978618  0.799159
  1  0.461479  0.780529
  2  0.118274  0.639921
  3  0.143353  0.944669
  4  0.521848  0.414662
3 0  0.264556  0.774234
  1  0.456150  0.568434
  2  0.018790  0.617635
  3  0.612096  0.616934
  4  0.943748  0.681820
4 0  0.359508  0.437032
  1  0.697631  0.060225
  2  0.666767  0.670638
  3  0.210383  0.128926
  4  0.315428  0.363711
  

在此示例中,我们选择了所有行 (slice(None))从两个索引级别,对于列选择,我们提供了列标签列表,['A', 'B'].

 

使用多个条件进行复杂数据选择

您可以使用多重条件从多索引 DataFrame 中选择数据:


# Select rows where A > 0.5 in level 1 index 2 and B < 0.3 in level 1 index 3
df_complex = df_sorted.loc[((df_sorted.index.get_level_values(0) == 2) & (df_sorted['A'] > 0.5)) |
                           ((df_sorted.index.get_level_values(0) == 3) & (df_sorted['B'] < 0.3))]
print(df_complex)  

Output:


            A         B
2 0  0.978618  0.799159
  4  0.521848  0.414662  

在这里,我们使用“管道”或“|”字符(翻译为“或”)组合多个条件。

位于括号内的“&”或“&”表示“和”。

因此,我们正在查找第一级索引为 2 且 A 列中的值大于 0.5 的行,或者第一级索引为 3 且 B 列中的值小于 0.3 的行。

 

处理多索引 DataFrame 中的缺失值

我们首先创建一个包含缺失值的 DataFrame。


df_missing = df_sorted.copy()
df_missing.loc[(2, 3), 'A'] = np.nan
df_missing.loc[(4, 0), 'B'] = np.nan
print(df_missing)  

Output:


            A         B
0 0  0.548814  0.715189
  1  0.602763  0.544883
  2  0.423655  0.645894
  3  0.437587  0.891773
  4  0.963663  0.383442
1 0  0.791725  0.528895
  1  0.568045  0.925597
  2  0.071036  0.087129
  3  0.020218  0.832620
  4  0.778157  0.870012
2 0  0.978618  0.799159
  1  0.461479  0.780529
  2  0.118274  0.639921
  3       NaN  0.944669
  4  0.521848  0.414662
3 0  0.264556  0.774234
  1  0.456150  0.568434
  2  0.018790  0.617635
  3  0.612096  0.616934
  4  0.943748  0.681820
4 0  0.359508       NaN
  1  0.697631  0.060225
  2  0.666767  0.670638
  3  0.210383  0.128926
  4  0.315428  0.363711
  

在上面的数据框中df_missing,我们故意在索引处的“A”列中设置缺失值(2, 3)和索引处的“B”列(4, 0).

您可以使用notna()选择非缺失或缺失数据:


# Select rows where 'A' is not missing
df_A_not_missing = df_missing.loc[df_missing['A'].notna()]
print(df_A_not_missing)  

Output:


            A         B
0 0  0.548814  0.715189
  1  0.602763  0.544883
  2  0.423655  0.645894
  3  0.437587  0.891773
  4  0.963663  0.383442
1 0  0.791725  0.528895
  1  0.568045  0.925597
  2  0.071036  0.087129
  3  0.020218  0.832620
  4  0.778157  0.870012
2 0  0.978618  0.799159
  1  0.461479  0.780529
  2  0.118274  0.639921
  4  0.521848  0.414662
3 0  0.264556  0.774234
  1  0.456150  0.568434
  2  0.018790  0.617635
  3  0.612096  0.616934
  4  0.943748  0.681820
4 0  0.359508       NaN
  1  0.697631  0.060225
  2  0.666767  0.670638
  3  0.210383  0.128926
  4  0.315428  0.363711
  

数据框df_A_not_missing由原始 DataFrame 中不缺少 A 的所有行组成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Pandas 中使用 loc 和 MultiIndex DataFrame 的相关文章

随机推荐

  • 如何在 PHP 中向数组追加项目

    问题 如何在 PHP 中向数组追加项目 如何在 PHP 中将任何元素追加到现有数组的末尾 如何在 PHP 中将元素推送到数组 本教程使用数组推 函数将新元素插入或追加到数组末尾 PHP 将元素追加到数组 以下示例创建一个包含两个元素 如 b
  • 如何在 Ubuntu 18.04 上安装 Yarn

    Yarn 是一个与 npm 兼容的 JavaScript 包管理器 可帮助您自动执行安装 更新 配置和删除 npm 包的过程 它的创建是为了解决 npm 的一系列问题 例如通过并行操作加快软件包安装过程并减少与网络连接相关的错误 在本教程中
  • 如何在 CentOS 7 上安装 Python 3

    本教程将指导您使用 Software Collections SCL 以及发行版默认 Python 版本 2 7 在 CentOS 7 系统上安装 Python 3 我们还将向您展示如何创建 Python 虚拟环境 Python 是世界上最
  • 如何在 Debian 10 Linux 上安装 Vagrant

    Vagrant是一个用于构建和管理虚拟机环境的开源命令行工具 默认情况下 Vagrant 可以在 VirtualBox Hyper V 之上配置计算机 和码头工人 其他提供商如 Libvirt KVM VMware 和 AWS 可以通过 V
  • Linux 中的 Wget 命令及示例

    GNU Wget 是一个用于从网络下载文件的命令行实用程序 使用 Wget 您可以使用 HTTP HTTPS 和 FTP 协议下载文件 Wget 提供了许多选项 允许您下载多个文件 恢复下载 限制带宽 递归下载 后台下载 镜像网站等等 本文
  • 如何在 Ubuntu 20.04 上安装 Odoo 15

    Odoo 是一款流行的开源商业应用程序套件 可帮助公司管理和运营其业务 它包括广泛的应用程序 例如 CRM 电子商务 网站构建器 计费 会计 制造 仓库 项目管理 库存等等 所有这些都无缝集成 Odoo根据使用案例和可用技术 可以以不同的方
  • 如何在 Debian 10 Linux 上安装 Node.js 和 npm

    Node js 是一个基于 Chrome JavaScript 构建的跨平台 JavaScript 运行时环境 旨在在服务器端执行 JavaScript 代码 使用 Node js 您可以构建可扩展的网络应用程序 npm 是 Node js
  • 如何在 Debian 9 上安装 Java

    在本教程中 我们将逐步介绍在 Debian 9 上安装 Java Java 是用于构建不同类型的应用程序和系统的最流行的编程语言之一 用 Java 开发的应用程序具有可扩展性 灵活性和可维护性 有两种不同的 Java 包 Java 运行时环
  • 如何在 Debian 9 上安装和使用 PHP Composer

    Composer是 PHP 的依赖管理器 类似于Node js 的 npm or Python 的点子 Composer 将提取您的项目所依赖的所有必需的 PHP 包并为您管理它们 本教程提供了在 Debian 9 系统上安装 Compos
  • 如何列出 CentOS 上已安装的软件包

    在本教程中 我们将向您展示如何列出和过滤 CentOS 上已安装的软件包 当您需要在另一台计算机上安装相同的软件包或想要重新安装系统时 了解如何列出 CentOS 系统上已安装的软件包会很有帮助 我们还将向您展示如何检查是否安装了特定的软件
  • 如何检查您的 CentOS 版本

    当您第一次登录 CentOS 计算机时 在进行任何工作之前 您可能需要检查系统上运行的 CentOS 版本 在本教程中 我们将展示几个不同的命令 了解如何检查系统上安装的 CentOS 版本 截至撰写本文时 CentOS Linux 拥有三
  • 如何在 CentOS 8 上添加交换空间

    交换空间是磁盘上的空间 当物理 RAM 内存已满时使用 当 Linux 系统耗尽 RAM 时 非活动页面将从 RAM 移至交换空间 交换空间可以采用专用交换分区或交换文件的形式 通常 在虚拟机上运行 CentOS 时 不存在交换分区 因此唯
  • 配置 Magento 2 在 CentOS 7 上使用 Varnish

    页面速度或加载时间对于在线商店的成功至关重要 加载时间是加载特定页面上的内容所需的总时间 加载时间越长 转化率越低 这也是谷歌考虑确定搜索引擎排名的最重要因素之一 在第一篇文章中 我们在 CentOS 7 机器上安装了 Magento 2
  • 自动启动 wampserver 在 Windows 10 上自动启动

    在向您展示如何自动启动 wampserver 之前 我先简单介绍一下 Wampserver 是 Windows 平台上最好的 Web 开发堆栈之一 与 xampp 相比 我更喜欢它 因为它有方便的托盘菜单 可以让我访问任何配置 您可以从此网
  • 使用 Sed 命令删除行:Linux 文本删除教程

    Using sed命令从文件或流中删除行是常见操作 使用删除行的基本语法sed如下 sed pattern to match d filename Here pattern to match是您要在文件的每一行中匹配的模式 如果一行包含指定
  • 使用 to_sql 将 Python Pandas DataFrame 导出到 SQL

    The to sql函数允许您将存储在 DataFrame 中的记录写入 SQL 数据库 通过使用 SQLAlchemy 可以使用该库支持的任何数据库 在接下来的部分中 我们将更深入地研究此功能并探索更多功能 目录 hide 1 基本语法和
  • Python NumPy arange() 教程

    NumPyarange 函数用于生成给定区间内的值序列 您可以将其视为数字范围生成器 它允许您创建一个 NumPy 数组 其值在指定范围内均匀分布 它提供了更多功能 例如使用浮点数的能力以及显式定义数组中包含的值的间隔的灵活性 在本教程中
  • Python 切片初学者指南

    在本教程中 您将了解切片在 Python 中的工作原理以及如何使用它来操作字符串 列表和元组等序列 我们还将演示 Python 切片对象如何创建可用于对序列进行切片的切片 这些知识将为您提供一个强大的工具来访问序列中的多个项目 以删除多个项
  • Python 中非常规颜色指南

    如果您一直在使用 Python 进行编程 那么您很可能至少遇到过一个提供处理颜色表示和自定义功能的库 From 图像处理从数据可视化到Web应用程序开发 你会发现颜色的使用无处不在 事实上 大多数用于最先进计算机视觉任务的现代深度神经网络都
  • 在 Pandas 中使用 loc 和 MultiIndex DataFrame

    在之前的教程中 我们讨论了locproperty 一种基于标签的数据选择方法 但是您是否知道在使用 loc 处理多级索引时可以优化您的选择 本教程将揭示在 Pandas 中使用 loc 和 MultiIndex DataFrame 的强大功