DataFrame的索引功能是其核心特性之一,提供了灵活高效的数据访问方式。Pandas提供了多种索引机制,包括标签索引、位置索引、布尔索引等。下面详细介绍DataFrame的各种索引功能:
1. 基本索引方法
1.1 [] 操作符索引
-
列索引:最常用的方式,通过列名获取列数据
pythonimport pandas as pd df = pd.DataFrame({ 'A': [1, 2, 3], 'B': ['a', 'b', 'c'], 'C': [4.5, 5.5, 6.5] }) col_a = df['A'] # 获取A列,返回Series -
多列选择:通过列表选择多列
pythoncols_ab = df[['A', 'B']] # 返回包含A、B列的DataFrame
1.2 点号(.)属性索引(不推荐)
-
可以通过点号访问列,但有局限性
pythoncol_a = df.A # 等同于df['A'] -
缺点 :
- 列名不能与DataFrame方法或属性同名(如'count', 'sum'等)
- 列名包含空格或特殊字符时无法使用
- 不支持多列选择
2. 高级索引方法
2.1 loc[] - 标签索引(Label-based indexing)
- 基于标签的索引,包含结束点
- 语法:
df.loc[row_selection, column_selection]
行选择示例:
python
# 单行
row_1 = df.loc[1] # 索引为1的行
# 行切片
rows_0_to_2 = df.loc[0:2] # 包含索引2的行
# 条件选择
rows_a_b = df.loc[df['B'].isin(['a', 'b'])]
列选择示例:
python
# 单列
col_b = df.loc[:, 'B']
# 多列
cols_ac = df.loc[:, ['A', 'C']]
# 行列组合选择
subset = df.loc[1:2, ['A', 'C']]
布尔索引:
python
# 选择A列大于1且B列等于'b'的行
result = df.loc[(df['A'] > 1) & (df['B'] == 'b')]
2.2 iloc[] - 位置索引(Integer-based indexing)
- 基于整数位置的索引,不包含结束点(类似Python切片)
- 语法:
df.iloc[row_position, column_position]
基本用法:
python
# 单元素
element = df.iloc[1, 2] # 第2行第3列
# 行选择
first_row = df.iloc[0] # 第一行
first_two_rows = df.iloc[0:2] # 前两行(不包含2)
# 列选择
first_col = df.iloc[:, 0] # 第一列
last_col = df.iloc[:, -1] # 最后一列
# 行列组合
subset = df.iloc[1:3, 0:2] # 2-3行,0-1列
2.3 at[] 和 iat[] - 快速访问单个值
- 针对单个值的快速访问,性能优于
loc和iloc at用于标签索引,iat用于位置索引
python
# 获取值
value_at = df.at[1, 'B'] # 第2行B列的值
value_iat = df.iat[1, 1] # 第2行第2列的值(位置索引)
# 设置值
df.at[1, 'B'] = 'x' # 修改第2行B列的值
df.iat[1, 1] = 'y' # 修改第2行第2列的值
3. 特殊索引功能
3.1 多级索引(MultiIndex)
- 创建具有多个索引级别的DataFrame
- 适用于高维数据表示
python
# 创建多级索引DataFrame
arrays = [['A', 'A', 'B', 'B'], [1, 2, 1, 2]]
index = pd.MultiIndex.from_arrays(arrays, names=('letter', 'number'))
df_multi = pd.DataFrame({'data': [10, 20, 30, 40]}, index=index)
# 多级索引选择
df_multi.loc['A'] # 选择letter为A的所有行
df_multi.loc[('A', 1)] # 选择letter为A且number为1的行
df_multi.loc[:, 'data'] # 选择data列(虽然这里只有一列)
3.2 交叉索引(Cross-section)
- 使用
xs()方法进行快速交叉索引 - 特别适用于多级索引
python
# 选择letter为A的所有行(等价于df_multi.loc['A'])
df_a = df_multi.xs('A')
# 选择letter为A且number为1的行
df_a1 = df_multi.xs(('A', 1)) # 或 df_multi.xs('A').xs(1)
3.3 布尔索引
- 使用布尔条件筛选数据
- 可以组合多个条件
python
# 单条件
df_bool = df[df['A'] > 1]
# 多条件组合
df_bool_multi = df[(df['A'] > 1) & (df['C'] < 6)]
# 使用isin()方法
df_isin = df[df['B'].isin(['a', 'c'])]
# 使用query()方法(更简洁的语法)
df_query = df.query('A > 1 and C < 6')
3.4 步长索引
- 在
loc和iloc中使用步长进行选择
python
# 选择所有行,每隔一列
df_step_cols = df.iloc[:, ::2]
# 选择每隔一行,所有列
df_step_rows = df.iloc[::2, :]
# 标签索引中使用步长
df_loc_step = df.loc[0:2:2, 'A':'C':2] # 从0到2步长2,A到C步长2
4. 索引操作
4.1 设置索引
python
# 将现有列设置为索引
df_set_index = df.set_index('B')
# 设置多列索引
df_set_multi_index = df.set_index(['A', 'B'])
# 创建新索引(不使用现有列)
df_new_index = df.set_index(pd.Index(range(100, 103)))
4.2 重置索引
python
# 将索引重置为默认整数索引
df_reset = df_set_index.reset_index()
# 重置索引但不丢弃原索引列
df_reset_drop = df_set_index.reset_index(drop=False)
# 重置特定级别的索引(多级索引时)
df_reset_level = df_set_multi_index.reset_index(level='A')
4.3 重新排序索引
python
# 按索引排序
df_sorted = df.sort_index()
# 按值排序(通过某列)
df_sorted_values = df.sort_values('A')
# 多级索引排序
df_multi_sorted = df_multi.sort_index(level=['letter', 'number'])
4.4 索引对齐
Pandas会自动对齐不同DataFrame的索引进行操作:
python
df1 = pd.DataFrame({'A': [1, 2, 3]}, index=['a', 'b', 'c'])
df2 = pd.DataFrame({'B': [4, 5, 6]}, index=['b', 'c', 'd'])
# 加法操作会自动对齐索引
result = df1 + df2 # 结果中会包含所有索引,缺失值为NaN
5. 性能考虑
-
选择方法性能比较(从快到慢):
at/iat>loc/iloc>[]操作符
-
链式索引的陷阱:
python# 不推荐(可能产生SettingWithCopyWarning) df[df['A'] > 1]['B'] = 0 # 推荐方式 df.loc[df['A'] > 1, 'B'] = 0 -
对于大数据集:
- 优先考虑
iloc进行位置索引 - 使用
query()方法可能比布尔索引更高效 - 考虑使用
eval()进行复杂计算
- 优先考虑
6. 实际应用示例
python
import pandas as pd
import numpy as np
# 创建示例DataFrame
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Salary': [50000, 60000, 70000, 80000],
'Department': ['HR', 'IT', 'Finance', 'IT']
}
df = pd.DataFrame(data).set_index('Name')
# 1. 使用loc选择IT部门员工
it_employees = df.loc[df['Department'] == 'IT']
# 2. 使用iloc选择前两行
first_two = df.iloc[0:2]
# 3. 使用at快速访问特定值
alice_salary = df.at['Alice', 'Salary']
# 4. 多级索引示例
df_multi = df.set_index(['Department', 'Age'])
it_30 = df_multi.loc[('IT', 30)]
# 5. 布尔索引组合条件
high_earners = df[(df['Salary'] > 65000) & (df['Age'] < 40)]
# 6. 使用query方法
finance_high = df.query('Department == "Finance" and Salary > 65000')
# 7. 索引重置和设置
df_reset = df.reset_index() # 将Name从索引移回列
df_new_index = df_reset.set_index(['Department', 'Age']) # 设置多级索引
DataFrame的索引功能非常强大且灵活,熟练掌握这些索引方法可以显著提高数据处理效率。在实际应用中,应根据具体需求选择合适的索引方法,并注意性能优化和避免常见陷阱。