12.3 按索引筛选(补充,高效)
Pandas索引筛选高效技巧:loc与iloc详解
本章节全面讲解Pandas中loc和iloc索引筛选方法,覆盖行筛选、列筛选和多级索引筛选,并提供高效技巧,帮助新手快速掌握数据筛选,提升数据分析效率。
推荐工具
Pandas索引筛选高效技巧
引言
在数据分析中,Pandas的索引筛选是处理数据的基础操作。正确使用索引方法不仅能让代码更简洁,还能提升执行效率。本章将深入讲解如何使用loc和iloc进行高效筛选,并涵盖多级索引等进阶技巧,适合新手学习和实践。
loc与iloc:基础对比
在Pandas中,loc和iloc是两种常用的索引筛选器,它们各有特点:
- loc:基于标签的索引器,用于通过行标签和列名来筛选数据。它非常适合处理具有有意义索引(如字符串或日期)的DataFrame。
- iloc:基于整数位置的索引器,用于通过行和列的整数位置索引(从0开始)来筛选数据。它适用于需要按位置访问的场景。
记住:loc使用标签,iloc使用位置,这是它们的核心区别。
按行索引筛选:使用loc和iloc
假设我们有一个DataFrame,索引为标签,如'row1'、'row2'等。我们可以使用loc和iloc来筛选特定行。
示例代码:
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
除了筛选行,我们还可以筛选列。loc和iloc支持同时指定行和列。
示例代码:
# 使用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')可以精确筛选到具体层级。
高效筛选技巧
为了提高代码效率和可读性,推荐以下技巧:
- 避免链式索引:不要使用
df['A'][0]这种方式,因为它可能导致不可预测的行为或警告。优先使用df.loc[0, 'A']或df.iloc[0, 0]。 - 使用.at和.iat进行快速标量访问:如果需要访问单个元素,
df.at[行标签, 列名]和df.iat[行位置, 列位置]比loc和iloc更快。 - 优先使用loc和iloc:在批量筛选时,
loc和iloc比循环更高效。 - 结合布尔索引:可以与条件筛选结合使用,例如
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
总结
loc和iloc是Pandas中强大的索引筛选工具:loc用于标签索引,iloc用于位置索引。- 熟练掌握行筛选、列筛选和多级索引筛选,能大幅提升数据处理效率。
- 实践高效技巧,如避免链式索引、使用.at和.iat,可以让代码更健壮和快速。
开发工具推荐