百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Pandas .loc 和 .iloc数据切片的差异

liuian 2025-09-06 06:25 3 浏览

在 Python 编程中,切片(slicing)是一种从字符串、列表或元组中提取子集的强大工具。同样,在 Pandas 库中,切片也可用于 Series 和 DataFrame 对象,但其行为方式略有不同,容易导致“越界”错误。本文将详细探讨如何在 Pandas 中正确使用切片操作,分析 .loc 和 .iloc 方法的差异,并通过示例代码阐明其工作原理。

1. Python 中的基本切片操作

在 Python 中,切片允许从序列(如字符串、列表或元组)中提取指定范围的元素。Python 切片遵循“包含起始索引,不包含结束索引”的规则。

示例:字符串切片

假设我们有一个字符串:

text = "abcdefghij"  # 包含 10 个字符
  • text[0] 返回第一个字符:"a"
  • text[4] 返回索引 4 的字符(即第 5 个字符):"e"
  • text[7] 返回索引 7 的字符(即第 8 个字符):"h"
  • text[4:7] 返回从索引 4 到索引 6(不包含 7)的子字符串:"efg"

示例:列表切片

对于列表,切片行为类似:

my_list = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
  • my_list[4] 返回索引 4 的元素:50
  • my_list[7] 返回索引 7 的元素:80
  • my_list[4:7] 返回从索引 4 到索引 6 的子列表:[50, 60, 70]

若要提取从索引 7 到列表末尾的元素,可以使用以下方法:

my_list[7:]  # 返回 [80, 90, 100]

或者显式指定结束索引:

my_list[7:10]  # 虽然索引 10 不存在,但返回 [80, 90, 100]

2. Pandas 中的切片操作

在 Pandas 中,Series 和 DataFrame 支持切片,但行为因使用 .loc 或 .iloc 而异。以下详细说明这两种方法。

2.1 创建 Pandas Series

以下是一个简单的 Pandas Series 示例:

import pandas as pd

s = pd.Series([10, 20, 30, 40, 50, 60, 70, 80, 90, 100])

2.2 使用.loc 和.iloc 进行切片

  • .loc 基于标签(label-based):根据索引的标签(可以是数字、字符串等)进行切片,包含结束标签。
  • .iloc 基于位置(position-based):根据整数位置进行切片,遵循 Python 的“包含起始索引,不包含结束索引”规则。

示例:.loc 和.iloc 的行为差异

# 使用 .loc 切片
print(s.loc[4:7])  # 输出索引 4 到 7(包含 7)的元素
# 输出:
# 4    50
# 5    60
# 6    70
# 7    80
# dtype: int64

# 使用 .iloc 切片
print(s.iloc[4:7])  # 输出索引 4 到 6(不包含 7)的元素
# 输出:
# 4    50
# 5    60
# 6    70
# dtype: int64

.loc 的包含结束标签行为与 Python 标准切片不同,这可能会让开发者感到意外。原因在于,Pandas 允许自定义索引,而非总是使用连续的整数索引。

2.3 自定义索引的复杂性

当 Series 使用自定义索引(如字符串)时,.loc 的行为更直观。考虑以下示例:

s = pd.Series([10, 20, 30, 40, 50, 60, 70, 80, 90, 100], 
              index=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'])
print(s.loc['d':'g'])  # 输出从标签 'd' 到 'g'(包含 'g')的元素
# 输出:
# d    40
# e    50
# f    60
# g    70
# dtype: int64

若索引非连续或非有序,.loc 仍会尝试包含起始和结束标签之间的所有元素。例如:

s = pd.Series([10, 20, 30, 40, 50], index=['j', 'i', 'g', 'f', 'e'])
print(s.loc['i':'e'])  # 输出从标签 'i' 到 'e'(包含 'e')
# 输出:
# i    20
# g    30
# f    40
# e    50
# dtype: int64

2.4 非唯一索引的问题

当索引包含重复值时,.loc 切片可能报错。例如:

s = pd.Series([10, 20, 30, 40, 50], index=['a', 'a', 'b', 'b', 'c'])
# print(s.loc['a':'b'])  # 报错:ValueError: cannot get left slice bound for non-unique label 'a'

解决方法是先对索引排序:

s_sorted = s.sort_index()
print(s_sorted.loc['a':'b'])
# 输出:
# a    10
# a    20
# b    30
# b    40
# dtype: int64

3. 在 DataFrame 中使用切片

DataFrame 的切片行为与 Series 类似,但需要注意 .loc 和 .iloc 的使用场景。以下示例使用一个出租车数据集:

df = pd.read_csv('taxi.csv')  # 假设 taxi.csv 包含出租车行程数据

示例:DataFrame 切片

假设 df 的索引是默认的整数索引:

print(df.loc[100:105])  # 输出索引 100 到 105(包含 105)的行
print(df.iloc[100:105])  # 输出索引 100 到 104(不包含 105)的行

若将某列(如 trip_pickup_datetime)设为索引:

df = df.set_index('trip_pickup_datetime')
# print(df.loc['2023-01-01 00:00:00':'2023-01-01 01:00:00'])  # 可能报错,若索引非唯一
df_sorted = df.sort_index()
print(df_sorted.loc['2023-01-01 00:00:00':'2023-01-01 01:00:00'])

4. 切片操作的注意事项

  1. 推荐使用 .loc.iloc:避免直接使用方括号([]),因为在 Series 中方括号表示元素选择,而在 DataFrame 中表示列选择,容易引发混淆。
  2. .loc 包含结束标签:与 Python 标准切片不同,.loc 的切片包含结束索引。
  3. .iloc 遵循 Python 切片规则:基于位置的切片,始终不包含结束索引。
  4. 非唯一索引需排序:在使用 .loc 进行切片前,确保索引唯一或已排序,否则可能导致错误。
  5. DataFrame 复杂索引:当 DataFrame 使用非数字索引(如日期时间)时,.loc 更适合处理基于标签的范围选择。

5. 结论

Pandas 的切片功能为数据处理提供了灵活性,但 .loc 和 .iloc 的行为差异需要特别注意。.loc 基于标签且包含结束标签,适合自定义索引;.iloc 基于位置且不包含结束索引,与 Python 标准切片一致。在处理非唯一或无序索引时,排序索引是避免错误的关键。通过合理使用这两种方法,开发者可以高效、准确地操作 Pandas 的 Series 和 DataFrame。

<script type="text/javascript" src="//mp.toutiao.com/mp/agw/mass_profit/pc_product_promotions_js?item_id=7521976811677286938"></script>

相关推荐

PHPMAILER实现PHP发邮件功能php实例

这篇文章主要为大家详细介绍了PHPMAILER实现PHP发邮件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下本文实例为大家分享了PHPMAILER实现PHP发邮件功能的具体代码,供大家参考,具...

Cacti监控服务器配置教程(基于CentOS+Nginx+MySQL+PHP环境搭建)

具体案例:局域网内有两台主机,一台Linux、一台Windows,现在需要配置一台Cacti监控服务器对这两台主机进行监控环境说明:1、Linux主机操作系统:CentOS6.2IP地址:192.1...

如何在webmin中配置多个PHP版本_怎么配置php

请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1.前言如何在webmin中配置多个PHP版本?本教程将会给您一些启示和操作案例。Web...

详解Drupal安装步骤_drools安装

DrupalDrupal是一个基于PHP语言编写的开源的内容管理系统(CMS:ContentManagementSystem),和Wordpress等CMS一样提供主题。在这里详细介绍一下安装Dr...

nternet 信息服务(IIS) 升级为IIS 6.0

 WindowsServer2003中Internet信息服务(IIS)升级为IIS6.0,其安全性更高。默认情况下,WindowsServer2003没有安装IIS6.0,要通过...

Php JIT 使用详解_php的!

简介PHP8引入的JIT(Just-In-Time编译器)是该版本的一个重要性能特性,首次让PHP有了运行时即时编译的能力,从解释型语言迈向了“编译执行”的方向。什么是JIT?JIT...

php 常见配置详解_php cgi配置

以下是PHP常见的配置项及其含义:error_reporting:设置错误报告级别,可以控制PHP显示哪些错误。例如,设置为E_ALL将显示所有错误,而设置为0将禁止显示任何错误。displa...

技巧:PHP版本怎样隐藏在Linux服务器

通常情况下,大多数安装web服务器软件的默认设置存在信息泄露,这些软件其中之一就是PHP。PHP是如今最流行的服务端html嵌入式语言之一。而在如今这个充满挑战的时代,有许多黑客会尝试发现你服务端的漏...

PHP八大安全函数解析_php安全设置

在现代互联网中,我们经常要从世界各地的用户中获得输入数据。但是,我们都知道“永远不能相信那些用户输入的数据”。所以在各种的Web开发语言中,都会提供保证用户输入数据安全的函数。在PHP中,有些非常有...

win7下apache+mysql+php安装配置_win7 mysql安装配置教程

一.首先下载好要用的apache版本:http://httpd.apache.org/download.cgimysql版本:http://dev.mysql.com/downloads/mys...

phpmyadmin取消最大文件限制的更改解决方法

用phpmyadmin导入大数据库的时候出现:Nodatawasreceivedtoimport.Eithernofilenamewassubmitted,orthefi...

成功安装 Magento2.4.3最新版教程「技术干货」

外贸独立站设计公司xingbell.com经过多次的反复实验,最新版的magento2.4.3在oneinstack的环境下的详细安装教程如下:一.vps系统:LinuxCentOS7.7.19...

CentOS、Nginx、PHP、MySQL的安装和配置记录

安装LNMP安装wget工具(可选) yuminstall-ywget下载Nginx wgethttp://www.atomicorp.com/installers/ato...

PHP扩展开发之路(二)_php扩展直接执行php代码

昨日,Jamlee发布了PHP扩展开发之路(一),今日再来续集,哈哈,会不会更有趣呢!不说多的,直接来!##0x2helloworld!,你的第一个php扩展##阅读前必看小贴士:如果你不想在本...

比较常见类型漏洞讲解(一)_常见漏洞的特点及危害

这里介绍一些手动挖掘漏洞时比较容易找到的漏洞,根据不同类型的漏洞来介绍。演示准备目标主机:Metasploitable2攻击目标:目标主机的dvwa系统攻击机:KaliSessionId盗用不知道你们...