文章目录
- import pandas as pd # 创建带自定义索引的DataFrame data = {“Age”: [25, 32, 28, 40], “City”: [“北京”, “上海”, “广州”, “深圳”]} df = pd.DataFrame(data, index=[“Alice”, “Bob”, “Charlie”, “David”]) # loc按标签选择 → 获取Bob行所有列 print(df.loc[“Bob”]) # 输出: Age 32, City 上海 # iloc按位置选择 → 获取第1行所有列(索引0为Alice) print(df.iloc[1]) # 输出: 同上(Bob行) Age 32City 上海Name: Bob, dtype: objectAge 32City 上海Name: Bob, dtype: object
- # loc切片包含结束标签 → 选择Alice到Charlie行 print(df.loc[“Alice”:”Charlie”]) # 输出3行数据 # iloc切片不包含结束位置 → 选择0至1行(不含索引2) print(df.iloc[0:2]) # 仅输出Alice和Bob行 Age CityAlice 25 北京Bob 32 上海Charlie 28 广州 Age CityAlice 25 北京Bob 32 上海
- # loc直接条件筛选 → 年龄>30的行 print(df.loc[df[“Age”] > 30]) # 输出Bob和David行 # iloc需分两步 → 先生成掩码再选择 mask = df[“Age”] > 30 print(df.iloc[mask.values]) # 需用.values转为数组 Age CityBob 32 上海David 40 深圳 Age CityBob 32 上海David 40 深圳
- # loc选择多列 → 所有行 + “City”列 print(df.loc[:, “City”]) # 输出城市列所有数据 # iloc选择连续列 → 所有行 + 第1列(列索引从0开始) print(df.iloc[:, 1]) # 同上(City列位置为1) Alice 北京Bob 上海Charlie 广州David 深圳Name: City, dtype: objectAlice 北京Bob 上海Charlie 广州David 深圳Name: City, dtype: object
- # loc + lambda → 筛选Age为偶数的行 print(df.loc[lambda x: x[“Age”] % 2 == 0]) # 输出Bob(32), David(40) # iloc + lambda → 筛选索引位置为奇数的行 print(df.iloc[lambda x: [i for i in range(len(x)) if i % 2 == 1]]) # 输出Bob行 Age CityBob 32 上海Charlie 28 广州David 40 深圳 Age CityBob 32 上海David 40 深圳
- 大型数据集:优先用 iloc(整数位置计算更快) 复杂索引:用 loc 避免位置计算错误(如时间序列索引) 混合场景:若需标签+位置混合索引,先重置索引再用 iloc df_reset = df.reset_index() df_reset.iloc[1:3, 0:2] # 选择第1-2行,第0-1列 index Age 1 Bob 32 2 Charlie 28
- 当行索引为整数时,loc 会优先识别为标签而非位置: df_int_index = pd.DataFrame({“Value”: [10, 20]}, index=[1, 2]) # loc尝试按标签访问 → 报错(无标签0) # df_int_index.loc[0] # KeyError # iloc按位置访问 → 正常 print(df_int_index.iloc[0]) # 输出索引1的行(Value:10) Value 10Name: 1, dtype: int64
- 仅 iloc 支持负数索引(从末尾计数): print(df.iloc[-1]) # 输出最后一行(David) Age 40City 深圳Name: David, dtype: object
目录
- 一、核心差异解析
- 二、关键场景代码示例
- 1. 基础索引对比
- 2. 切片行为差异
- 3. 布尔索引使用
- 4. 混合行列选择
- 三、高级技巧与性能
- 1. 函数式索引
- 2. 性能优化建议
- 四、特殊场景处理
- 1. 整数索引陷阱
- 2. 负索引支持
- 五、总结:选择策略
Pandas 索引器 loc 和 iloc 比较及代码示例

以下是针对 Pandas 中 loc 和 iloc 的深度对比分析及代码示例,结合核心差异、使用场景和底层机制展开说明:
| 特性 | loc (标签索引) | iloc (位置索引) |
|---|---|---|
| 索引类型 | 行/列标签(字符串、日期等) | 行/列整数位置(从0开始) |
| 切片行为 | 包含结束标签(闭区间) | 不包含结束位置(左闭右开) |
| 布尔索引 | 直接支持条件表达式(更直观) | 需先生成布尔数组再操作 |
| 索引灵活性 | 支持非整数标签(如字符串索引) | 仅支持整数位置 |
import pandas as pd
# 创建带自定义索引的DataFrame
data = {"Age": [25, 32, 28, 40], "City": ["北京", "上海", "广州", "深圳"]}
df = pd.DataFrame(data, index=["Alice", "Bob", "Charlie", "David"])
# loc按标签选择 → 获取Bob行所有列
print(df.loc["Bob"]) # 输出: Age 32, City 上海
# iloc按位置选择 → 获取第1行所有列(索引0为Alice)
print(df.iloc[1]) # 输出: 同上(Bob行)
Age 32
City 上海
Name: Bob, dtype: object
Age 32
City 上海
Name: Bob, dtype: object
Age 32
City 上海
Name: Bob, dtype: object
Age 32
City 上海
Name: Bob, dtype: object
# loc切片包含结束标签 → 选择Alice到Charlie行
print(df.loc["Alice":"Charlie"]) # 输出3行数据
# iloc切片不包含结束位置 → 选择0至1行(不含索引2)
print(df.iloc[0:2]) # 仅输出Alice和Bob行
Age City
Alice 25 北京
Bob 32 上海
Charlie 28 广州
Age City
Alice 25 北京
Bob 32 上海
Age City
Alice 25 北京
Bob 32 上海
Charlie 28 广州
Age City
Alice 25 北京
Bob 32 上海
# loc直接条件筛选 → 年龄>30的行
print(df.loc[df["Age"] > 30]) # 输出Bob和David行
# iloc需分两步 → 先生成掩码再选择
mask = df["Age"] > 30
print(df.iloc[mask.values]) # 需用.values转为数组
Age City
Bob 32 上海
David 40 深圳
Age City
Bob 32 上海
David 40 深圳
Age City
Bob 32 上海
David 40 深圳
Age City
Bob 32 上海
David 40 深圳
# loc选择多列 → 所有行 + "City"列
print(df.loc[:, "City"]) # 输出城市列所有数据
# iloc选择连续列 → 所有行 + 第1列(列索引从0开始)
print(df.iloc[:, 1]) # 同上(City列位置为1)
Alice 北京
Bob 上海
Charlie 广州
David 深圳
Name: City, dtype: object
Alice 北京
Bob 上海
Charlie 广州
David 深圳
Name: City, dtype: object
Alice 北京
Bob 上海
Charlie 广州
David 深圳
Name: City, dtype: object
Alice 北京
Bob 上海
Charlie 广州
David 深圳
Name: City, dtype: object
# loc + lambda → 筛选Age为偶数的行
print(df.loc[lambda x: x["Age"] % 2 == 0]) # 输出Bob(32), David(40)
# iloc + lambda → 筛选索引位置为奇数的行
print(df.iloc[lambda x: [i for i in range(len(x)) if i % 2 == 1]]) # 输出Bob行
Age City
Bob 32 上海
Charlie 28 广州
David 40 深圳
Age City
Bob 32 上海
David 40 深圳
Age City
Bob 32 上海
Charlie 28 广州
David 40 深圳
Age City
Bob 32 上海
David 40 深圳
- 大型数据集:优先用
iloc(整数位置计算更快)
- 复杂索引:用
loc 避免位置计算错误(如时间序列索引)
- 混合场景:若需标签+位置混合索引,先重置索引再用
iloc
df_reset = df.reset_index()
df_reset.iloc[1:3, 0:2] # 选择第1-2行,第0-1列
iloc(整数位置计算更快)loc 避免位置计算错误(如时间序列索引)iloc| index | Age | |
|---|---|---|
| 1 | Bob | 32 |
| 2 | Charlie | 28 |
当行索引为整数时,loc 会优先识别为标签而非位置:
df_int_index = pd.DataFrame({"Value": [10, 20]}, index=[1, 2])
# loc尝试按标签访问 → 报错(无标签0)
# df_int_index.loc[0] # KeyError
# iloc按位置访问 → 正常
print(df_int_index.iloc[0]) # 输出索引1的行(Value:10)
Value 10
Name: 1, dtype: int64
仅 iloc 支持负数索引(从末尾计数):
print(df.iloc[-1]) # 输出最后一行(David)
Age 40
City 深圳
Name: David, dtype: object
| 场景 | 推荐方法 | 原因 |
|---|---|---|
| 已知行/列标签(如列名为"Age") | loc | 直接标签访问,语义清晰 |
| 按行号/列号操作(如前三行) | iloc | 位置计算高效 |
| 时间序列数据(日期索引) | loc | 避免位置漂移(如df.loc["2023":"2025"]) |
| 大数据集遍历 | iloc | 整数位置操作速度更快 |
最佳实践:优先用 loc 保证可读性,性能敏感时切 iloc。始终通过 print(df.head()) 确认数据结构,避免索引混淆。
到此这篇关于Pandas索引器 loc 和 iloc 比较及代码示例的文章就介绍到这了,更多相关Pandas索引器 loc 和 iloc内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- Python Pandas数据分析之iloc和loc的用法详解
- 详谈Pandas中iloc和loc以及ix的区别
- 聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
- python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
- 一文秒懂pandas中iloc()函数
- 利用Pandas读取某列某行数据之loc和iloc用法总结
- Pandas中的loc与iloc区别与用法小结
- 对pandas中iloc,loc取数据差别及按条件取值的方法详解
- Python Pandas中loc和iloc函数的基本用法示例
- python中pandas库的iloc函数用法解析