loc vs 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]。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
本阶段实战方法 · 一条能复现的数据流水线
把接口返回的数据变成可用于因子研究的面板时,先处理时点、主键与单位。
- 建立数据字典:字段、单位、时区、交易日历、数据源、抓取时间、原始价与复权因子。
- 用(date, code)查重,区分停牌、未上市、窗口不足和真实缺失;不要用向后填充把未来值带回过去。
- 保存原始快照与清洗日志,固定随机种子和环境版本;接口字段变化时先核对官方文档。
使用边界
- 报告期不等于公告可用日,盘后公告通常不能用于当天收盘前决策。
- API输出名为“动态市盈率”时不能直接改名TTM;浏览器练习不支持任意原生库或行情抓取接口。
不懂的术语:标签(Label / Target)
背景 · 从一个困惑说起
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更好(标签比位置自解释);正确性>速度
🛠 本题实践任务
构造一个日期索引的DataFrame:分别用loc和iloc取第一行、最后一行、2024年1月的切片——体会两种方式的语义差异。
💡 提示(先自己想5分钟再看)
loc['2024-01-01':'2024-01-31']按日期切片;iloc[0:5]按位置切片——两个的结果可能不同。
✅ 验收标准
两种索引方式的对照结果。loc/iloc从此泾渭分明。
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
Python · 独立工作线程 · 执行限时10秒
🤖 AI导师
导师会先检查你的前置知识(DataFrame索引),再用案例、公式和代码帮助理解。此功能需要先启用服务。