4.3 DataFrame的索引与切片(核心操作,重中之重)
Pandas DataFrame索引与切片详解:新手必备核心操作指南
本章节详细讲解Pandas DataFrame的索引与切片操作,包括按列、按行、布尔索引、切片方法等,帮助初学者快速掌握数据筛选的核心技巧,避免常见错误。
推荐工具
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)。
- loc切片:基于标签,包含结尾,例如
示例代码:
# 切片操作:行切片
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)时,索引方法类似,但需要指定多个层级。使用loc和iloc,结合元组或列表选择。
- 示例:创建多级索引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. 常见索引错误与解决方法
新手在使用索引时常遇到错误,这里列出一些常见问题:
- KeyError:当使用
df['列名']或df.loc[行标签]时,如果列名或行标签不存在,会引发KeyError。- 解决方法:先检查列名或行标签是否正确,使用
df.columns查看列名,或df.index查看索引标签。
- 解决方法:先检查列名或行标签是否正确,使用
- IndexError:使用
df.iloc[行位置]时,如果位置超出范围(如df.iloc[10]但只有3行),会引发IndexError。- 解决方法:使用
len(df)检查行数,或使用切片避免越界。
- 解决方法:使用
- 混淆loc和iloc:错误使用基于标签或位置的方法。
- 解决方法:记住loc用于标签,iloc用于位置;如果不确定,先查看索引类型。
- 切片包含/不包含错误:忘记loc切片包含结尾,iloc切片不包含结尾。
- 解决方法:通过简单测试确认切片范围。
总结
索引与切片是操作Pandas DataFrame的核心技能,从简单按列选择到复杂布尔条件筛选,都能大大提高数据处理的效率。建议多加练习,结合实际数据项目巩固知识。掌握这些方法后,你将能轻松应对各种数据选择场景!
开发工具推荐