5.pandas 索引和切片

在 Pandas 中,索引(Indexing)和切片(Slicing)是数据处理的核心操作。以下是详细的分类和操作方法,涵盖基础到高级应用场景:


一、基础索引方式

  1. 列索引
# 选择单列 → 返回 Series
df['列名']       

# 选择多列 → 返回 DataFrame
df[['列名1', '列名2']]
  1. 行索引
# 通过位置选择行 → 前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] 基于位置访问单个元素

三、lociloc 详解

  1. loc (Label-based)
# 选择行标签为2的行,所有列
df.loc[2, :]  

# 选择行标签1-3,列'A'到'C'
df.loc[1:3, 'A':'C']  

# 布尔索引
df.loc[df['Age'] > 30, ['Name', 'Age']]
  1. 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列

四、高级索引技巧

  1. 多层索引 (MultiIndex)
# 创建多层索引
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), :]
  1. 时间序列索引
# 设置时间为索引
df.set_index('Date', inplace=True)  

# 选择2023年的数据
df['2023']  

# 选择时间范围
df.loc['2023-01':'2023-03']
  1. 条件筛选
# 多条件组合
df[(df['Age'] > 25) & (df['City'] == '北京')]

# isin筛选
df[df['ID'].isin([101, 102, 103])]

# query方法
df.query('Age > 30 and Income > 5000')

五、索引性能优化

  1. 设置索引加速查询
# 对常用查询列设置索引
df.set_index('UserID', inplace=True)  

# 多列索引
df.set_index(['City', 'District'], inplace=True)
  1. 避免链式索引
# 错误用法(产生警告)
- 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   深圳

七、注意事项

  1. 索引与切片的区别:
    • 索引:选择特定行/列

    • 切片:选择连续范围

  2. 视图与副本:
    • 大多数索引操作返回视图(View),直接修改会影响原数据

    • 需要独立副本时使用 .copy()

  3. 重置索引:

    df.reset_index(drop=True, inplace=True)  # 删除原索引
    

掌握这些索引方法,可以高效地实现数据筛选、切片和重组,满足复杂的数据处理需求。

你可能感兴趣的:(#,python进阶,pandas)