Pandas索引器 loc 和 iloc 比较及代码示例
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、核心差异解析</a></li><li><a href="#_label1">二、关键场景代码示例</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">1. 基础索引对比</a></li><li><a href="#_lab2_1_1">2. 切片行为差异</a></li><li><a href="#_lab2_1_2">3. 布尔索引使用</a></li><li><a href="#_lab2_1_3">4. 混合行列选择</a></li></ul><li><a href="#_label2">三、高级技巧与性能</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_4">1. 函数式索引</a></li><li><a href="#_lab2_2_5">2. 性能优化建议</a></li></ul><li><a href="#_label3">四、特殊场景处理</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_6">1. 整数索引陷阱</a></li><li><a href="#_lab2_3_7">2. 负索引支持</a></li></ul><li><a href="#_label4">五、总结:选择策略</a></li><ul class="second_class_ul"></ul></ul></div><p>Pandas 索引器 loc 和 iloc 比较及代码示例</p><p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010809554375.png" /></p>
<p>以下是针对 Pandas 中 <code>loc</code> 和 <code>iloc</code> 的深度对比分析及代码示例,结合核心差异、使用场景和底层机制展开说明:</p>
<p class="maodian"><a name="_label0"></a></p><h2>一、核心差异解析</h2>
<table><thead><tr><th><strong>特性</strong></th><th><strong>loc (标签索引)</strong></th><th><strong>iloc (位置索引)</strong></th></tr></thead><tbody><tr><td><strong>索引类型</strong></td><td>行/列标签(字符串、日期等)</td><td>行/列整数位置(从0开始)</td></tr><tr><td><strong>切片行为</strong></td><td>包含结束标签(闭区间)</td><td>不包含结束位置(左闭右开)</td></tr><tr><td><strong>布尔索引</strong></td><td>直接支持条件表达式(更直观)</td><td>需先生成布尔数组再操作</td></tr><tr><td><strong>索引灵活性</strong></td><td>支持非整数标签(如字符串索引)</td><td>仅支持整数位置</td></tr></tbody></table>
<p class="maodian"><a name="_label1"></a></p><h2>二、关键场景代码示例</h2>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>1. 基础索引对比</h3>
<div class="jb51code"><pre class="brush:py;">import pandas as pd
# 创建带自定义索引的DataFrame
data = {"Age": , "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) # 输出: 同上(Bob行)
</pre></div>
<blockquote><p>Age 32<br />City 上海<br />Name: Bob, dtype: object<br />Age 32<br />City 上海<br />Name: Bob, dtype: object</p></blockquote>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>2. 切片行为差异</h3>
<div class="jb51code"><pre class="brush:py;"># loc切片包含结束标签 → 选择Alice到Charlie行
print(df.loc["Alice":"Charlie"])# 输出3行数据
# iloc切片不包含结束位置 → 选择0至1行(不含索引2)
print(df.iloc) # 仅输出Alice和Bob行
</pre></div>
<blockquote><p> Age City<br />Alice 25 北京<br />Bob 32 上海<br />Charlie 28 广州<br /> Age City<br />Alice 25 北京<br />Bob 32 上海</p></blockquote>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>3. 布尔索引使用</h3>
<div class="jb51code"><pre class="brush:py;"># loc直接条件筛选 → 年龄>30的行
print(df.loc > 30]) # 输出Bob和David行
# iloc需分两步 → 先生成掩码再选择
mask = df["Age"] > 30
print(df.iloc) # 需用.values转为数组
</pre></div>
<blockquote><p> Age City<br />Bob 32 上海<br />David 40 深圳<br /> Age City<br />Bob 32 上海<br />David 40 深圳</p></blockquote>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>4. 混合行列选择</h3>
<div class="jb51code"><pre class="brush:py;"># loc选择多列 → 所有行 + "City"列
print(df.loc[:, "City"]) # 输出城市列所有数据
# iloc选择连续列 → 所有行 + 第1列(列索引从0开始)
print(df.iloc[:, 1]) # 同上(City列位置为1)
</pre></div>
<blockquote><p>Alice 北京<br />Bob 上海<br />Charlie 广州<br />David 深圳<br />Name: City, dtype: object<br />Alice 北京<br />Bob 上海<br />Charlie 广州<br />David 深圳<br />Name: City, dtype: object</p></blockquote>
<p class="maodian"><a name="_label2"></a></p><h2>三、高级技巧与性能</h2>
<p class="maodian"><a name="_lab2_2_4"></a></p><h3>1. 函数式索引</h3>
<div class="jb51code"><pre class="brush:py;"># loc + lambda → 筛选Age为偶数的行
print(df.loc % 2 == 0])# 输出Bob(32), David(40)
# iloc + lambda → 筛选索引位置为奇数的行
print(df.iloc])# 输出Bob行
</pre></div>
<blockquote><p> Age City<br />Bob 32 上海<br />Charlie 28 广州<br />David 40 深圳<br /> Age City<br />Bob 32 上海<br />David 40 深圳</p></blockquote>
<p class="maodian"><a name="_lab2_2_5"></a></p><h3>2. 性能优化建议</h3>
<ul><li><strong>大型数据集</strong>:优先用 <code>iloc</code>(整数位置计算更快)</li><li><strong>复杂索引</strong>:用 <code>loc</code> 避免位置计算错误(如时间序列索引)</li><li><strong>混合场景</strong>:若需标签+位置混合索引,先重置索引再用 <code>iloc</code></li></ul>
<div class="jb51code"><pre class="brush:py;">df_reset = df.reset_index()
df_reset.iloc# 选择第1-2行,第0-1列
</pre></div>
<table border="1"><thead><tr><th></th><th>index</th><th>Age</th></tr></thead><tbody><tr><th>1</th><td>Bob</td><td>32</td></tr><tr><th>2</th><td>Charlie</td><td>28</td></tr></tbody></table>
<p class="maodian"><a name="_label3"></a></p><h2>四、特殊场景处理</h2>
<p class="maodian"><a name="_lab2_3_6"></a></p><h3>1. 整数索引陷阱</h3>
<p>当行索引为整数时,<code>loc</code> 会优先识别为标签而非位置:</p>
<div class="jb51code"><pre class="brush:py;">df_int_index = pd.DataFrame({"Value": }, index=)
# loc尝试按标签访问 → 报错(无标签0)
# df_int_index.loc# KeyError
# iloc按位置访问 → 正常
print(df_int_index.iloc)# 输出索引1的行(Value:10)
</pre></div>
<blockquote><p>Value 10<br />Name: 1, dtype: int64</p></blockquote>
<p class="maodian"><a name="_lab2_3_7"></a></p><h3>2. 负索引支持</h3>
<p>仅 <code>iloc</code> 支持负数索引(从末尾计数):</p>
<div class="jb51code"><pre class="brush:py;">print(df.iloc[-1])# 输出最后一行(David)
</pre></div>
<blockquote><p>Age 40<br />City 深圳<br />Name: David, dtype: object</p></blockquote>
<p class="maodian"><a name="_label4"></a></p><h2>五、总结:选择策略</h2>
<table><thead><tr><th>场景</th><th>推荐方法</th><th>原因</th></tr></thead><tbody><tr><td>已知行/列标签(如列名为"Age")</td><td>loc</td><td>直接标签访问,语义清晰</td></tr><tr><td>按行号/列号操作(如前三行)</td><td>iloc</td><td>位置计算高效</td></tr><tr><td>时间序列数据(日期索引)</td><td>loc</td><td>避免位置漂移(如df.loc["2023":"2025"])</td></tr><tr><td>大数据集遍历</td><td>iloc</td><td>整数位置操作速度更快</td></tr></tbody></table>
<blockquote><p>最佳实践:优先用 loc 保证可读性,性能敏感时切 iloc。始终通过 print(df.head()) 确认数据结构,避免索引混淆。</p></blockquote>
頁:
[1]