DataFrame的索引功能是其核心特性之一,提供了灵活高效的数据访问方式。
Pandas提供了多种索引机制,包括标签索引、位置索引、布尔索引等。
下面详细介绍DataFrame的各种索引功能:
1.
基本索引方法
1.1[]操作符索引
列索引:最常用的方式,通过列名获取列数据
importpandasaspddf=pd.DataFrame({'A':[1,2,3],'B':['a','b','c'],'C':[4.5,5.5,6.5]})col_a=df['A']#
获取A列,返回Series
多列选择:通过列表选择多列
cols_ab=df[['A','B']]#返回包含A、B列的DataFrame
1.2
点号(.)属性索引(不推荐)
- 可以通过点号访问列,但有局限性
col_a=df.A#等同于df['A']
- 缺点:
- 列名不能与DataFrame方法或属性同名(如’count’,
'sum’等)
- 列名包含空格或特殊字符时无法使用
- 不支持多列选择
- 列名不能与DataFrame方法或属性同名(如’count’,
2.
高级索引方法
2.1loc[]-
indexing)
- 基于标签的索引,包含结束点
- 语法:
df.loc[row_selection,column_selection]
行选择示例:
#单行
row_1=df.loc[1]#行切片
rows_0_to_2=df.loc[0:2]#条件选择
rows_a_b=df.loc[df['B'].isin(['a','b'])]列选择示例:
#单列
col_b=df.loc[:,'B']#多列
cols_ac=df.loc[:,['A','C']]#行列组合选择
subset=df.loc[1:2,['A','C']]布尔索引:
#选择A列大于1且B列等于'b'的行
result=df.loc[(df['A']>1)&(df['B']=='b')]2.2iloc[]-
indexing)
- 基于整数位置的索引,不包含结束点(类似Python切片)
- 语法:
df.iloc[row_position,column_position]
基本用法:
#单元素
element=df.iloc[1,2]#第2行第3列
#行选择
first_row=df.iloc[0]#第一行
first_two_rows=df.iloc[0:2]#前两行(不包含2)
#列选择
first_col=df.iloc[:,0]#第一列
last_col=df.iloc[:,-1]#最后一列
#行列组合
subset=df.iloc[1:3,0:2]#2-3行,0-1列
2.3at[]和iat[]-
快速访问单个值
- 针对单个值的快速访问,性能优于
loc和iloc at用于标签索引,iat用于位置索引
#获取值
value_at=df.at[1,'B']#第2行B列的值
value_iat=df.iat[1,1]#第2行第2列的值(位置索引)
#设置值
df.at[1,'B']='x'#修改第2行B列的值
df.iat[1,1]='y'#修改第2行第2列的值
3.特殊索引功能
3.1
多级索引(MultiIndex)
- 创建具有多个索引级别的DataFrame
- 适用于高维数据表示
#创建多级索引DataFrame
arrays=[['A','A','B','B'],[1,2,1,2]]index=pd.MultiIndex.from_arrays(arrays,names=('letter','number'))df_multi=pd.DataFrame({'data':[10,20,30,40]},index=index)#多级索引选择
df_multi.loc['A']#选择letter为A的所有行
df_multi.loc[('A',1)]#选择letter为A且number为1的行
df_multi.loc[:,'data']#选择data列(虽然这里只有一列)
3.2
交叉索引(Cross-section)
- 使用
xs()方法进行快速交叉索引 - 特别适用于多级索引
#选择letter为A的所有行(等价于df_multi.loc['A'])
df_a=df_multi.xs('A')#选择letter为A且number为1的行
df_a1=df_multi.xs(('A',1))#df_multi.xs('A').xs(1)
3.3
布尔索引
- 使用布尔条件筛选数据
- 可以组合多个条件
#单条件
df_bool=df[df['A']>1]#多条件组合
df_bool_multi=df[(df['A']>1)&(df['C']<6)]#使用isin()方法
df_isin=df[df['B'].isin(['a','c'])]#使用query()方法(更简洁的语法)
df_query=df.query('A>
6'
)3.4
步长索引
- 在
loc和iloc中使用步长进行选择
#选择所有行,每隔一列
df_step_cols=df.iloc[:,::2]#选择每隔一行,所有列
df_step_rows=df.iloc[::2,:]#标签索引中使用步长
df_loc_step=df.loc[0:2:2,'A':'C':2]#从0到2步长2,A到C步长2
4.索引操作
4.1
将现有列设置为索引df_set_index=df.set_index('B')#
设置多列索引df_set_multi_index=df.set_index(['A','B'])#
创建新索引(不使用现有列)df_new_index=df.set_index(pd.Index(range(100,103)))
4.2
将索引重置为默认整数索引df_reset=df_set_index.reset_index()#
重置索引但不丢弃原索引列df_reset_drop=df_set_index.reset_index(drop=False)#
重置特定级别的索引(多级索引时)df_reset_level=df_set_multi_index.reset_index(level='A')
4.3
按索引排序df_sorted=df.sort_index()#
按值排序(通过某列)df_sorted_values=df.sort_values('A')#
多级索引排序df_multi_sorted=df_multi.sort_index(level=['letter','number'])
4.4
索引对齐
Pandas会自动对齐不同DataFrame的索引进行操作:
df1=pd.DataFrame({'A':[1,2,3]},index=['a','b','c'])df2=pd.DataFrame({'B':[4,5,6]},index=['b','c','d'])#加法操作会自动对齐索引
result=df1+df2#结果中会包含所有索引,缺失值为NaN
5.
性能考虑
选择方法性能比较(从快到慢):
at/iat>loc/iloc>[]操作符
链式索引的陷阱:
#不推荐(可能产生SettingWithCopyWarning)
df[df['A']>1]['B']=0#推荐方式
df.loc[df['A']>1,'B']=0对于大数据集:
- 优先考虑
iloc进行位置索引 - 使用
query()方法可能比布尔索引更高效 - 考虑使用
eval()进行复杂计算
- 优先考虑
6.
实际应用示例
importpandasaspdimportnumpyasnp#创建示例DataFrame
data={'Name':['Alice','Bob','Charlie','David'],'Age':[25,30,35,40],'Salary':[50000,60000,70000,80000],'Department':['HR','IT','Finance','IT']}df=pd.DataFrame(data).set_index('Name')#使用loc选择IT部门员工
it_employees=df.loc[df['Department']=='IT']#使用iloc选择前两行
first_two=df.iloc[0:2]#使用at快速访问特定值
alice_salary=df.at['Alice','Salary']#多级索引示例
df_multi=df.set_index(['Department','Age'])it_30=df_multi.loc[('IT',30)]#布尔索引组合条件
high_earners=df[(df['Salary']>65000)&(df['Age']<40)]#使用query方法
finance_high=df.query('Department==
65000'
)#索引重置和设置
df_reset=df.reset_index()#将Name从索引移回列
df_new_index=df_reset.set_index(['Department','Age'])#设置多级索引
DataFrame的索引功能非常强大且灵活,熟练掌握这些索引方法可以显著提高数据处理效率。
在实际应用中,应根据具体需求选择合适的索引方法,并注意性能优化和避免常见陷阱。


