Pandas :索引机制与数据访问

张开发
2026/4/3 8:12:43 15 分钟阅读
Pandas :索引机制与数据访问
Pandas 的运行逻辑建立在索引对象之上。索引对象不仅用于显示标签更承担“标签查找”的职责。所有基于标签的访问与运算都会先经过索引对象完成查找与匹配再进入数据区域。示例数据import pandas as pd df pd.DataFrame({ 姓名: [张三, 李四, 王五], 城市: [北京, 上海, 北京], 收入: [8000, 12000, 10000], 年龄: [25, 30, 28]}) # 显式设置行索引df.index [A001, A002, A003]print(df)输出姓名 城市 收入 年龄A001 张三 北京 8000 25A002 李四 上海 12000 30A003 王五 北京 10000 28此时 DataFrame 中的数据访问存在四种定位途径1行标签A001、A002、A0032行位置0、1、23列标签姓名、城市、收入、年龄4列位置0、1、2、3这四种定位途径共同构成二维结构的定位体系。需要区分的是• 标签labels由 Index 对象管理• 位置position由数据区域的物理排列决定在 Pandas 中.loc 负责基于标签的访问.iloc 主要负责基于位置的访问。一、.loc基于标签访问.loc[] 根据参数结构既可返回单行Series单列Series单元格值标量或子 DataFrame。基本语法df.loc[row_selector, col_selector]• row_selector行标签选择器• col_selector列标签选择器可省略默认选择全部列1、访问单行按行标签访问返回一个 Series行切片结果。语法df.loc[行标签]示例df.loc[A002] # 行标签返回姓名 李四城市 上海年龄 30Name: A002, dtype: object注意该 Series 是按列组织的一行结果并不是 DataFrame 内部按列组织的“列 Series”。2、访问单列指定列标签可返回 Series 或单列 DataFrame。1返回 Series语法df.loc[:, 列标签]列访问的简写形式df[列标签]示例df.loc[:, 姓名] df[姓名]返回A001 张三A002 李四A003 王五Name: 姓名, dtype: object2返回单列 DataFrame语法df.loc[:, [列标签]]示例df.loc[:, [姓名]]返回姓名A001 张三A002 李四A003 王五3、访问单个元素若同时指定行标签与列标签可返回单元格值标量。语法df.loc[行标签, 列标签]示例df.loc[A002, 城市]返回上海建议使用 .at[] 进行快速地单个元素按标签访问df.at[A002, 城市]4、访问数据区域——标签切片DataFrame 的切片表达式与列表的切片表达式基本类似。.loc 支持基于标签的切片返回子 DataFrame。1行切片语法df.loc[起始行标签:结束行标签]或者df.loc[起始行标签:结束行标签, :]示例df.loc[A001:A002]返回姓名 城市 收入 年龄A001 张三 北京 8000 25A002 李四 上海 12000 30说明• .loc 标签切片为左闭右闭。• 切片依据索引标签的顺序而不是自动排序• 若索引无序切片结果可能不符合区间直觉2行列同时切片语法df.loc[起始行标签:结束行标签, 起始列标签:结束列标签]示例df.loc[A002:A003, 姓名:收入]返回姓名 城市 收入A002 李四 上海 12000A003 王五 北京 10000二、.iloc基于整数位置访问.iloc[] 使用整数位置对数据进行访问。这里的“整数位置”指的是数据的物理排列顺序。基本语法df.iloc[row_position, col_position]• row_position行位置选择器从 0 开始• col_position列位置选择器从 0 开始可省略默认选择全部列1、访问单行按行位置访问返回一个 Series行切片结果。语法df.iloc[行位置]示例df.iloc[0] # 第 0 行返回姓名 张三城市 北京收入 8000年龄 25Name: A001, dtype: object2、访问单列指定列位置可返回 Series 或单列 DataFrame。1返回 Series语法df.iloc[:, 列位置]示例df.iloc[:, 0] # 第 0 列返回A001 张三A002 李四A003 王五Name: 姓名, dtype: object2返回单列 DataFrame语法df.iloc[:, [列位置]]示例df.iloc[:, [1]]返回城市A001 北京A002 上海A003 北京3、访问单个元素若同时指定单个行位置与列位置可返回单元格值标量。语法df.iloc[行位置, 列位置]示例df.iloc[1, 1] # 第 1 行第 1 列返回上海建议使用 .iat[] 进行快速地单个元素按位置访问df.iat[1, 1]4、访问数据区域——位置切片.iloc 支持基于整数位置的切片返回子 DataFrame。1行切片语法df.iloc[起始位置:结束位置]示例df.iloc[0:2]返回姓名 城市 收入 年龄A001 张三 北京 8000 25A002 李四 上海 12000 30说明• .iloc 位置切片为左闭右开包含起始位置不包含结束位置• 不依赖索引排序状态2行列同时切片语法df.iloc[起始行位置:结束行位置, 起始列位置:结束列位置]示例df.iloc[0:2, 0:2]返回姓名 城市A001 张三 北京A002 李四 上海三、按条件访问按条件访问是通过布尔数组对数据进行筛选的机制。其本质是先生成布尔序列然后根据 True / False 选择数据区域。当布尔对象为 Series 时Pandas 会进行索引对齐index alignment按标签匹配布尔 Series → 索引匹配 → 数据提取当布尔对象为 ndarray 或 list 时则按位置匹配布尔数组 → 位置匹配 → 数据提取基本语法df[布尔对象]df.loc[布尔对象]df.iloc[布尔数组]布尔对象通常由条件表达式生成例如df[年龄] 25多个条件可以通过逻辑运算符进行组合。例如df[(df[年龄] 25) (df[城市] 北京)]注意• 必须使用 逻辑与、|逻辑或、~逻辑非不能使用 and、or、not• 每个条件必须使用括号包裹条件组合的本质是对布尔 Series 进行逐元素逻辑运算因此必须使用按位逻辑运算符并保证运算优先级正确。1、按条件筛选行首先生成布尔 Seriesmask df[年龄] 25生成的 maskA001 FalseA002 TrueA003 TrueName: 年龄, dtype: bool然后使用筛选df[mask]或df.loc[mask]说明当传入布尔对象时DataFrame.__getitem__ 会将其解释为行筛选。返回姓名 城市 收入 年龄A002 李四 上海 12000 30A003 王五 北京 10000 28说明mask 是带索引的 SeriesPandas 按索引标签匹配仅选择值为 True 的行。2、按条件筛选列首先生成布尔数组。col_mask df.columns 年龄col_mask 是基于列索引生成的布尔数组[False False False True]列筛选为布尔数组按位置匹配df.loc[:, col_mask]返回单列 DataFrame年龄A001 25A002 30A003 283、返回单列的条件筛选若同时指定列标签可返回单列 Series。df.loc[df[年龄] 25, 姓名]返回A002 李四A003 王五Name: 姓名, dtype: object4、布尔数组无索引筛选若传入 NumPy 布尔数组import numpy as np mask_array np.array([False, True, True])df[mask_array]返回对应 True 的行姓名 城市 收入 年龄A002 李四 上海 12000 30A003 王五 北京 10000 285、使用 .iloc 进行位置条件筛选原理同上利用布尔数组.iloc 按整数位置筛选mask df[年龄] 25df.iloc[mask.values]说明布尔数组长度必须等于行数否则抛出 IndexError。 小结DataFrame 的索引机制将“标签”与“位置”两套定位体系统一在同一结构之中。.loc 与 .iloc 分别对应标签访问与位置访问.at 与 .iat 优化单值读取布尔筛选则通过索引对齐或位置匹配完成数据提取。理解索引对象的查找与对齐机制是掌握 Pandas 数据访问语义的核心。“点赞有美意赞赏是鼓励”

更多文章