Pandas 中文手册

12.3 按索引筛选(补充,高效)

Pandas索引筛选高效技巧:loc与iloc详解

Pandas 中文手册

本章节全面讲解Pandas中loc和iloc索引筛选方法,覆盖行筛选、列筛选和多级索引筛选,并提供高效技巧,帮助新手快速掌握数据筛选,提升数据分析效率。

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

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

了解更多

Pandas索引筛选高效技巧

引言

在数据分析中,Pandas的索引筛选是处理数据的基础操作。正确使用索引方法不仅能让代码更简洁,还能提升执行效率。本章将深入讲解如何使用lociloc进行高效筛选,并涵盖多级索引等进阶技巧,适合新手学习和实践。

loc与iloc:基础对比

在Pandas中,lociloc是两种常用的索引筛选器,它们各有特点:

  • loc:基于标签的索引器,用于通过行标签和列名来筛选数据。它非常适合处理具有有意义索引(如字符串或日期)的DataFrame。
  • iloc:基于整数位置的索引器,用于通过行和列的整数位置索引(从0开始)来筛选数据。它适用于需要按位置访问的场景。

记住:loc使用标签,iloc使用位置,这是它们的核心区别。

按行索引筛选:使用loc和iloc

假设我们有一个DataFrame,索引为标签,如'row1'、'row2'等。我们可以使用lociloc来筛选特定行。

示例代码:

import pandas as pd

# 创建一个示例DataFrame
df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6]
}, index=['row1', 'row2', 'row3'])

print("原始DataFrame:")
print(df)

# 使用loc筛选行(基于标签)
print("\n使用loc筛选行(标签为'row2'):")
print(df.loc['row2'])  # 输出第二行数据,索引标签为'row2'

# 使用iloc筛选行(基于位置)
print("\n使用iloc筛选行(位置为1,即第二行):")
print(df.iloc[1])  # 输出第二行数据,位置索引从0开始

输出解释:

  • df.loc['row2']返回一个Series,表示行标签为'row2'的数据。
  • df.iloc[1]也返回第二行数据,但它是通过整数位置访问的。

按列索引筛选:使用loc和iloc

除了筛选行,我们还可以筛选列。lociloc支持同时指定行和列。

示例代码:

# 使用loc筛选列(基于列名)
print("\n使用loc筛选列(列名为'A'):")
print(df.loc[:, 'A'])  # 冒号表示所有行,'A'表示列A

# 使用iloc筛选列(基于列位置)
print("\n使用iloc筛选列(位置为0,即第一列):")
print(df.iloc[:, 0])  # 冒号表示所有行,0表示第一列

# 组合筛选行和列
print("\n使用loc筛选特定行和列(行标签'row1',列名'A'):")
print(df.loc['row1', 'A'])  # 返回标量值

print("\n使用iloc筛选特定行和列(位置0行,0列):")
print(df.iloc[0, 0])  # 返回标量值

关键点:

  • df.loc[:, 'A']筛选出所有行的列A。
  • df.iloc[:, 0]筛选出所有行的第一列。
  • 使用逗号分隔行和列索引,可以实现更精细的筛选。

按多级索引筛选:使用loc分层筛选

当DataFrame具有多级索引(MultiIndex)时,我们可以使用loc进行分层筛选,这非常适合处理复杂数据。

示例代码:

# 创建一个多级索引DataFrame
data = {
    'value': [10, 20, 30, 40, 50, 60]
}
index_tuples = [
    ('Group1', 'A'),
    ('Group1', 'B'),
    ('Group1', 'C'),
    ('Group2', 'A'),
    ('Group2', 'B'),
    ('Group2', 'C')
]
df_multi = pd.DataFrame(data, index=pd.MultiIndex.from_tuples(index_tuples, names=['Group', 'Subgroup']))

print("多级索引DataFrame:")
print(df_multi)

# 使用loc筛选特定层级
print("\n筛选Group为'Group1'的所有数据:")
print(df_multi.loc['Group1'])  # 输出第一级索引为'Group1'的所有行

print("\n筛选Group为'Group1'且Subgroup为'A'的数据:")
print(df_multi.loc[('Group1', 'A')])  # 使用元组指定多级索引

# 部分索引筛选
print("\n筛选所有Group为'Group2'的行:")
print(df_multi.loc['Group2', :])  # 冒号表示所有Subgroup

解释:

  • 多级索引允许数据分层组织。
  • df_multi.loc['Group1']筛选出第一级索引为'Group1'的所有数据。
  • 使用元组如('Group1', 'A')可以精确筛选到具体层级。

高效筛选技巧

为了提高代码效率和可读性,推荐以下技巧:

  1. 避免链式索引:不要使用df['A'][0]这种方式,因为它可能导致不可预测的行为或警告。优先使用df.loc[0, 'A']df.iloc[0, 0]
  2. 使用.at和.iat进行快速标量访问:如果需要访问单个元素,df.at[行标签, 列名]df.iat[行位置, 列位置]lociloc更快。
  3. 优先使用loc和iloc:在批量筛选时,lociloc比循环更高效。
  4. 结合布尔索引:可以与条件筛选结合使用,例如df.loc[df['A'] > 2, 'B']筛选列A大于2的行中的列B。

示例:

# 高效标量访问
print("使用.at访问单个元素(行标签'row1', 列名'A'):")
print(df.at['row1', 'A'])  # 输出1

print("\n使用.iat访问单个元素(位置0行, 0列):")
print(df.iat[0, 0])  # 输出1

总结

  • lociloc是Pandas中强大的索引筛选工具:loc用于标签索引,iloc用于位置索引。
  • 熟练掌握行筛选、列筛选和多级索引筛选,能大幅提升数据处理效率。
  • 实践高效技巧,如避免链式索引、使用.at和.iat,可以让代码更健壮和快速。
开发工具推荐
Python开发者工具包

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

获取工具包