在Pandas中,loc
和iloc
是用于DataFrame和Series数据选择的两种核心方法,本质区别在于索引方式:loc
基于标签(label),而iloc
基于整数位置(integer position)。以下是详细对比及用法说明:
特性 | loc |
iloc |
---|---|---|
索引类型 | 标签(字符串、日期等) | 整数位置(从0开始) |
切片行为 | 闭区间(包含结束标签) | 开区间(不包含结束位置) |
支持索引 | 标签、布尔数组、条件表达式 | 整数、整数列表/切片、布尔数组(需基于位置) |
适用场景 | 按行/列名称选择、条件筛选 | 按物理位置选择(如第n行/列) |
loc
:基于标签的索引df.loc['a'] # 选择标签为'a'的行
df.loc[:, 'Age'] # 选择列名为'Age'的所有行
df.loc[['a', 'c'], ['Name', 'City']] # 选择'a'和'c'行,'Name'和'City'列
df.loc['a':'c', 'Name':'City'] # 从'a'到'c'行,'Name'到'City'列(含'c'和'City')
df.loc[df['Age'] > 30] # 筛选Age>30的行
df.loc[df['City'].isin(['New York'])] # 筛选City为纽约的行
iloc
:基于位置的索引df.iloc[0] # 第1行(位置0)
df.iloc[:, 1] # 第2列(位置1)
df.iloc[[0, 2], [0, 2]] # 第1行和第3行,第1列和第3列
df.iloc[0:2, 1:3] # 第1-2行(不含第2行),第2-3列(不含第3列)
mask = (df['Age'] > 30).values # 生成布尔数组并转换为位置索引
df.iloc[mask] # 选择满足条件的行
loc['a':'c']
包含标签'a'
、'b'
、'c'。
iloc[0:2]
仅包含位置0和1(不包含2)。loc
可处理非整数标签(如字符串索引)。iloc
仅支持整数位置,与DataFrame的索引标签无关。loc
可直接用列条件(如df['A'] > 0
)。iloc
需将布尔数组转换为位置索引(如.values
)。loc
当:iloc
当:import pandas as pd
data = {'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35], 'City': ['NY', 'LA', 'Chicago']}
df = pd.DataFrame(data, index=['a', 'b', 'c'])
# loc示例:选择'a'到'b'行,'Name'列(包含'b')
df.loc['a':'b', 'Name'] # 输出:a→Alice, b→Bob
# iloc示例:选择前2行,第1列(位置0)
df.iloc[0:2, 0] # 输出:a→Alice, b→Bob(不包含第2行)
提示:若索引重复,
loc
会返回所有匹配标签的行,此时可用.reset_index()
重置索引。
掌握两者差异,可更高效精准地操作Pandas数据结构!