阶段4Python 基础进阶●●●●●

loc vs iloc:标签索引与位置索引的分界线

我的掌握程度:
q-307精讲

先掌握这个答案

loc=按标签:df.loc['2024-01-15']——找索引标签为该日期的行。iloc=按位置:df.iloc[0]——永远取第0行。结果一样的条件:索引是0开始的连续整数且未排序/筛选过。致命不同的场景:①set_index('date')后loc[0]报错(没有标签0)、iloc[0]正常取第一行;②筛选后索引跳跃——iloc[0]≠loc[0]。

先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。

从理解到使用

本阶段实战方法 · 一条能复现的数据流水线

把接口返回的数据变成可用于因子研究的面板时,先处理时点、主键与单位。

  1. 建立数据字典:字段、单位、时区、交易日历、数据源、抓取时间、原始价与复权因子。
  2. 用(date, code)查重,区分停牌、未上市、窗口不足和真实缺失;不要用向后填充把未来值带回过去。
  3. 保存原始快照与清洗日志,固定随机种子和环境版本;接口字段变化时先核对官方文档。

使用边界

  • 报告期不等于公告可用日,盘后公告通常不能用于当天收盘前决策。
  • API输出名为“动态市盈率”时不能直接改名TTM;浏览器练习不支持任意原生库或行情抓取接口。
背景 · 从一个困惑说起
df.loc[0]和df.iloc[0]——当索引从0开始连续时结果一样——但一旦你做过set_index或排序,两者天差地别:loc[0]找标签为0的行(可能不存在),iloc[0]永远取第一行。混用是新手静默bug的冠军。
由此产生的问题
loc和iloc的核心区别?什么时候结果一样、什么时候致命不同?如何避免混用错误?
核心概念
loc=按标签:df.loc['2024-01-15']——找索引标签为该日期的行。iloc=按位置:df.iloc[0]——永远取第0行。结果一样的条件:索引是0开始的连续整数且未排序/筛选过。致命不同的场景:①set_index('date')后loc[0]报错(没有标签0)、iloc[0]正常取第一行;②筛选后索引跳跃——iloc[0]≠loc[0]。
为什么需要它
①静默bug之王:因为结果「有时候一样」——bug不会立刻暴露——直到某天索引变了才炸;②时序数据的正确姿势:用loc切片(loc['2020':'2023'])更安全(语义明确=标签范围)——iloc需要算位置偏移容易出错;③防御习惯:看index前先print(df.index[:5])——知道当前索引是什么再选。
实际应用场景
时序标准三步:df = df.sort_index(); df.loc['2024-01-01':]取今年;df.iloc[-5:]取最近5行。
与之前知识的联系
q-306(双索引面板)的操作语法;与q-319(datetime处理)配合做时序切片。
⚠ 常见误解
  • loc和iloc差不多可以互换:连续整数索引时恰好一样——但一旦set_index/筛选/排序就分道扬镳
  • loc支持负数索引:不支持——loc[-1]会去找标签-1(报错或错误结果);iloc[-1]取最后一行
  • iloc更快所以全用iloc:iloc确实快一点——但可读性和安全性loc更好(标签比位置自解释);正确性>速度

🤖 AI导师

导师会先检查你的前置知识(DataFrame索引),再用案例、公式和代码帮助理解。此功能需要先启用服务。