在 Pandas 中,索引(Indexing)和切片(Slicing)是数据处理的核心操作。以下是详细的分类和操作方法,涵盖基础到高级应用场景:
一、基础索引方式
# 选择单列 → 返回 Series
df['列名']
# 选择多列 → 返回 DataFrame
df[['列名1', '列名2']]
# 通过位置选择行 → 前3行
df.iloc[0:3]
# 通过标签选择行 → 标签为a,b的行
df.loc[['a', 'b']]
二、核心索引方法对比
方法 | 定位方式 | 示例 | 特点 |
---|---|---|---|
[] |
列选择 | df['Age'] |
仅用于列选择 |
loc |
标签索引 | df.loc[:, 'Name':'Age'] |
支持行/列标签,包含端点 |
iloc |
位置索引 | df.iloc[0:3, 1:4] |
基于整数位置,不包含末端 |
at |
快速标量 | df.at[2, 'Name'] |
访问单个元素,速度更快 |
iat |
快速标量 | df.iat[2, 1] |
基于位置访问单个元素 |
三、loc
与 iloc
详解
loc
(Label-based)# 选择行标签为2的行,所有列
df.loc[2, :]
# 选择行标签1-3,列'A'到'C'
df.loc[1:3, 'A':'C']
# 布尔索引
df.loc[df['Age'] > 30, ['Name', 'Age']]
iloc
(Integer Position-based)# 选择第0行,所有列
df.iloc[0, :]
# 选择第1-3行(不含3),第2-4列(不含4)
df.iloc[1:3, 2:4]
# 混合选择
df.iloc[[0,2], [1,3]] # 第0、2行,1、3列
四、高级索引技巧
# 创建多层索引
index = pd.MultiIndex.from_tuples(
[('A', 1), ('A', 2), ('B', 1)],
names=['Class', 'ID']
)
df.index = index
# 选择所有Class为A的数据
df.xs('A', level='Class')
# 同时选择Class和ID
df.loc[('A', 1), :]
# 设置时间为索引
df.set_index('Date', inplace=True)
# 选择2023年的数据
df['2023']
# 选择时间范围
df.loc['2023-01':'2023-03']
# 多条件组合
df[(df['Age'] > 25) & (df['City'] == '北京')]
# isin筛选
df[df['ID'].isin([101, 102, 103])]
# query方法
df.query('Age > 30 and Income > 5000')
五、索引性能优化
# 对常用查询列设置索引
df.set_index('UserID', inplace=True)
# 多列索引
df.set_index(['City', 'District'], inplace=True)
# 错误用法(产生警告)
- df['Age'][df['Name'] == 'Alice'] = 30
# 正确用法
+ df.loc[df['Name'] == 'Alice', 'Age'] = 30
六、索引操作示例
示例 DataFrame:
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 32, 28, 40],
'City': ['北京', '上海', '广州', '深圳'],
'Income': [5000, 8000, 6000, 12000]
}
df = pd.DataFrame(data)
df.index = ['a', 'b', 'c', 'd']
操作示例:
# 选择北京和上海的数据
print(df.loc[['a', 'b'], ['Name', 'City']])
# 输出:
Name City
a Alice 北京
b Bob 上海
# 选择年龄>30的行,前三列
print(df.loc[df['Age'] > 30, :].iloc[:, 0:3])
# 输出:
Name Age City
b Bob 32 上海
d David 40 深圳
七、注意事项
索引与切片的区别:
• 索引:选择特定行/列
• 切片:选择连续范围
视图与副本:
• 大多数索引操作返回视图(View),直接修改会影响原数据
• 需要独立副本时使用 .copy()
重置索引:
df.reset_index(drop=True, inplace=True) # 删除原索引
掌握这些索引方法,可以高效地实现数据筛选、切片和重组,满足复杂的数据处理需求。