Pandas 中文手册

4.3 DataFrame的索引与切片(核心操作,重中之重)

Pandas DataFrame索引与切片详解:新手必备核心操作指南

Pandas 中文手册

本章节详细讲解Pandas DataFrame的索引与切片操作,包括按列、按行、布尔索引、切片方法等,帮助初学者快速掌握数据筛选的核心技巧,避免常见错误。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

DataFrame的索引与切片:核心操作详解

索引与切片是Pandas DataFrame中最基础且最重要的操作,它允许我们从数据中精确选择所需的部分。无论是数据清洗、分析还是可视化,都离不开这些操作。本教程将手把手带你入门,涵盖所有核心方法,让你轻松上手。

1. 按列索引

按列索引是最直接的数据选择方式。在DataFrame中,列通常用列名表示。

  • 直接取列名:使用方括号指定列名,如df['列名'],返回一个Series对象。
  • 使用loc方法df.loc[:, '列名'],返回指定列的所有行数据。

示例代码

import pandas as pd

# 创建示例DataFrame
data = {'姓名': ['Alice', 'Bob', 'Charlie'],
        '年龄': [25, 30, 35],
        '薪资': [50000, 60000, 70000]}
df = pd.DataFrame(data)

# 按列索引:直接取列名
age_series = df['年龄']  # 返回年龄列的Series
print(age_series)

# 使用loc方法
salary_column = df.loc[:, '薪资']  # 返回薪资列的所有行
print(salary_column)

输出

0    25
1    30
2    35
Name: 年龄, dtype: int64
0    50000
1    60000
2    70000
Name: 薪资, dtype: int64

2. 按行索引

按行索引允许我们基于标签或位置选择数据行。

  • 使用loc方法:基于行标签(如索引名)选择,例如df.loc[0]选择标签为0的行。
  • 使用iloc方法:基于整数位置选择,从0开始,例如df.iloc[0]选择第一行。

示例代码

# 按行索引:使用loc(基于标签)
row_by_label = df.loc[0]  # 选择标签为0的行(第一行)
print(row_by_label)

# 使用iloc(基于位置)
row_by_position = df.iloc[0]  # 选择第一行
print(row_by_position)

输出

姓名     Alice
年龄       25
薪资    50000
Name: 0, dtype: object
姓名     Alice
年龄       25
薪资    50000
Name: 0, dtype: object

注意:如果DataFrame有自定义索引,loc会基于标签选择,而iloc总是基于整数位置。

3. 按行+列索引

结合行和列索引可以精确选择DataFrame中的某个单元格或多个单元格。

  • 使用loc方法df.loc[行标签, 列名],如df.loc[0, '年龄']选择第一行的年龄值。
  • 使用iloc方法df.iloc[行位置, 列位置],如df.iloc[0, 1]选择第一行第二列的值(位置从0开始)。

示例代码

# 按行+列索引
cell_loc = df.loc[0, '年龄']  # 基于标签
print(cell_loc)  # 输出: 25

cell_iloc = df.iloc[0, 1]  # 基于位置,第一行第二列
print(cell_iloc)  # 输出: 25

4. 布尔索引

布尔索引是基于条件筛选数据的强大工具。

  • 按行条件筛选:使用布尔Series或条件表达式,例如df[df['年龄'] > 30]选择年龄大于30的行。
  • 按列条件筛选:较少用,但可以通过条件选择列,例如df.loc[:, df.columns.str.startswith('年')]选择列名以“年”开头的列。

示例代码

# 布尔索引:按行条件筛选
age_filtered = df[df['年龄'] > 25]  # 选择年龄大于25的行
print(age_filtered)

# 按列条件筛选(示例:选择所有数值列)
numeric_cols = df.select_dtypes(include=['int64']).columns
df_numeric = df[numeric_cols]
print(df_numeric)

输出

      姓名  年龄    薪资
1    Bob  30  60000
2  Charlie  35  70000
   年龄    薪资
0  25  50000
1  30  60000
2  35  70000

5. 切片操作

切片允许我们选择连续的行或列范围。

  • 行切片:使用标签切片(如df.loc[0:2])或位置切片(如df.iloc[0:2]),注意结尾包含/不包含的差异。
  • 列切片:使用df.loc[:, '开始列':'结束列'](基于标签)或df.iloc[:, 开始列位置:结束列位置](基于位置)。
  • 标签与位置切片的区别
    • loc切片:基于标签,包含结尾,例如df.loc[0:2]选择标签0到2的行(包括标签2)。
    • iloc切片:基于位置,不包含结尾,例如df.iloc[0:2]选择位置0到1的行(不包含位置2)。

示例代码

# 切片操作:行切片
row_slice_loc = df.loc[0:1]  # 标签切片,包含结尾
print(row_slice_loc)

row_slice_iloc = df.iloc[0:2]  # 位置切片,不包含结尾,选择第一行和第二行
print(row_slice_iloc)

# 列切片
col_slice_loc = df.loc[:, '姓名':'年龄']  # 标签切片
print(col_slice_loc)

col_slice_iloc = df.iloc[:, 0:2]  # 位置切片
print(col_slice_iloc)

输出

    姓名  年龄    薪资
0  Alice  25  50000
1    Bob  30  60000
    姓名  年龄    薪资
0  Alice  25  50000
1    Bob  30  60000
    姓名  年龄
0  Alice  25
1    Bob  30
2  Charlie  35
    姓名  年龄
0  Alice  25
1    Bob  30
2  Charlie  35

6. 多级索引DataFrame的索引方法(提前入门)

当DataFrame有多级索引(MultiIndex)时,索引方法类似,但需要指定多个层级。使用lociloc,结合元组或列表选择。

  • 示例:创建多级索引DataFrame并索引。
# 创建多级索引示例
data_multi = {'姓名': ['Alice', 'Bob', 'Charlie'],
              '部门': ['A', 'B', 'A'],
              '年龄': [25, 30, 35]}
df_multi = pd.DataFrame(data_multi)
df_multi.set_index(['部门', '姓名'], inplace=True)  # 设置多级索引

# 索引方法
# 使用loc选择特定层级
selected = df_multi.loc[('A', 'Alice'), :]  # 选择部门A、姓名Alice的行
print(selected)

输出

年龄    25
Name: (A, Alice), dtype: int64

7. 常见索引错误与解决方法

新手在使用索引时常遇到错误,这里列出一些常见问题:

  1. KeyError:当使用df['列名']df.loc[行标签]时,如果列名或行标签不存在,会引发KeyError。
    • 解决方法:先检查列名或行标签是否正确,使用df.columns查看列名,或df.index查看索引标签。
  2. IndexError:使用df.iloc[行位置]时,如果位置超出范围(如df.iloc[10]但只有3行),会引发IndexError。
    • 解决方法:使用len(df)检查行数,或使用切片避免越界。
  3. 混淆loc和iloc:错误使用基于标签或位置的方法。
    • 解决方法:记住loc用于标签,iloc用于位置;如果不确定,先查看索引类型。
  4. 切片包含/不包含错误:忘记loc切片包含结尾,iloc切片不包含结尾。
    • 解决方法:通过简单测试确认切片范围。

总结

索引与切片是操作Pandas DataFrame的核心技能,从简单按列选择到复杂布尔条件筛选,都能大大提高数据处理的效率。建议多加练习,结合实际数据项目巩固知识。掌握这些方法后,你将能轻松应对各种数据选择场景!

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包