Pandas df.loc() 函数
loc[] 是 Pandas 中基于标签(Label)的索引方式,用于通过行标签和列标签来选择数据。它是 DataFrame 索引中最直观、最常用的方式之一,能够精确地定位我们需要的数据。
与基于位置的索引(如 iloc[])不同,loc[] 使用的是数据本身设置的索引标签。这意味着即使数据的位置发生变化,只要标签不变,我们依然能够准确地选择到目标数据。
基本语法与参数
loc[] 是 DataFrame 的索引器,通过方括号 [] 来访问。方括号内可以传入多种形式的参数,用于选择行、列或特定的单元格。
语法格式
# 选择单行(返回 Series) DataFrame.loc[行标签] # 选择多行(返回 DataFrame) DataFrame.loc[[行标签1, 行标签2, ...]] # 选择行和列 DataFrame.loc[行标签, 列标签] DataFrame.loc[行切片, 列切片] DataFrame.loc[行条件, 列条件]
参数说明
| 参数位置 | 参数类型 | 说明 |
|---|---|---|
| 第一个参数(行) | 标签、标签列表、标签切片、布尔数组 | 用于选择行,可以是单个标签、多个标签、切片或条件表达式。 |
| 第二个参数(列) | 标签、标签列表、标签切片 | 可选,用于选择列,语法与行选择相同。 |
返回值说明
- 单个元素: 返回标量值(单个值)。
- 单行: 返回一个 Series。
- 多行: 返回一个 DataFrame。
- 行列组合: 根据选择结果返回 Series 或 DataFrame。
实例
让我们通过丰富的例子全面掌握 loc[] 的用法。
示例 1:基础用法 - 使用默认索引
当 DataFrame 使用默认的整数索引时,loc[] 的行为与 iloc[] 类似,但使用的是标签而非位置。
实例
import pandas as pd
# 创建示例 DataFrame
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88],
'grade': ['A', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data)
print("原始 DataFrame:")
print(df)
print()
# 使用 loc 选择单行(通过索引标签)
print("选择第 0 行:")
print(df.loc[0])
print()
# 选择多行
print("选择第 1、3、4 行:")
print(df.loc[[1, 3, 4]])
print()
# 使用切片选择连续的行(注意:loc 的切片是两端包含的)
print("选择第 1 行到第 3 行(包含两端):")
print(df.loc[1:3])
# 创建示例 DataFrame
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88],
'grade': ['A', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data)
print("原始 DataFrame:")
print(df)
print()
# 使用 loc 选择单行(通过索引标签)
print("选择第 0 行:")
print(df.loc[0])
print()
# 选择多行
print("选择第 1、3、4 行:")
print(df.loc[[1, 3, 4]])
print()
# 使用切片选择连续的行(注意:loc 的切片是两端包含的)
print("选择第 1 行到第 3 行(包含两端):")
print(df.loc[1:3])
运行结果:
原始 DataFrame:
name age score grade
0 Alice 18 85 A
1 Bob 19 92 A
2 Charlie 17 78 B
3 David 18 90 A
4 Eve 20 88 B
选择第 0 行:
name Alice
age 18
score 85
grade A
Name: 0, dtype: object
选择第 1、3、4 行:
name age score grade
1 Bob 19 92 A
3 David 18 90 A
4 Eve 20 88 B
选择第 1 行到第 3 行(包含两端):
name age score grade
1 Bob 19 92 A
2 Charlie 17 78 B
3 David 18 90 A
代码解析:
- 默认情况下,DataFrame 的索引是整数 0、1、2、3、4。
df.loc[0]选择索引标签为 0 的行,返回一个 Series。df.loc[[1, 3, 4]]选择多个特定索引的行。- 重要:
loc[]的切片是两端包含的(不同于 Python 切片),1:3包含索引 1、2、3。
示例 2:使用自定义索引
loc[] 的真正强大之处在于可以使用自定义索引标签,这是它与 iloc[] 的根本区别。
实例
import pandas as pd
# 创建带自定义索引的 DataFrame
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88],
'grade': ['A', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd', 'e'])
print("带自定义索引的 DataFrame:")
print(df)
print()
# 使用自定义标签选择单行
print("选择索引为 'b' 的行:")
print(df.loc['b'])
print()
# 使用自定义标签切片
print("选择索引 'b' 到 'd' 的行:")
print(df.loc['b':'d'])
print()
# 选择多个不连续的索引
print("选择索引 'a', 'c', 'e' 的行:")
print(df.loc[['a', 'c', 'e']])
# 创建带自定义索引的 DataFrame
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88],
'grade': ['A', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd', 'e'])
print("带自定义索引的 DataFrame:")
print(df)
print()
# 使用自定义标签选择单行
print("选择索引为 'b' 的行:")
print(df.loc['b'])
print()
# 使用自定义标签切片
print("选择索引 'b' 到 'd' 的行:")
print(df.loc['b':'d'])
print()
# 选择多个不连续的索引
print("选择索引 'a', 'c', 'e' 的行:")
print(df.loc[['a', 'c', 'e']])
运行结果:
带自定义索引的 DataFrame:
name age score grade
a Alice 18 85 A
b Bob 19 92 A
c Charlie 17 78 B
d David 18 90 A
e Eve 20 88 B
选择索引为 'b' 的行:
name Bob
age 19
score 92
grade A
Name: b, dtype: object
选择索引 'b' 到 'd' 的行:
name age score grade
b Bob 19 92 A
c Charlie 17 78 B
d David 18 90 A
选择索引 'a', 'c', 'e' 的行:
name age score grade
a Alice 18 85 A
c Charlie 17 78 B
e Eve 20 88 B
代码解析:
- 自定义索引使用字符串 'a', 'b', 'c', 'd', 'e' 代替整数索引。
loc[]使用这些标签来选择数据,非常直观。- 切片 'b':'d' 包含标签 'b', 'c', 'd',同样是两端包含。
示例 3:选择特定的列
loc[] 不仅可以选行,还可以同时选择列。
实例
import pandas as pd
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88],
'grade': ['A', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd', 'e'])
# 选择特定行的特定列
print("选择索引 'b' 的 name 和 score 列:")
print(df.loc['b', ['name', 'score']])
print()
# 选择多行多列
print("选择索引 'a', 'c' 的 name 和 age 列:")
print(df.loc[['a', 'c'], ['name', 'age']])
print()
# 选择所有行的特定列
print("所有行的 name 和 grade 列:")
print(df.loc[:, ['name', 'grade']])
print()
# 行切片和列切片结合
print("索引 'b' 到 'd' 的 name 到 score 列:")
print(df.loc['b':'d', 'name':'score'])
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88],
'grade': ['A', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd', 'e'])
# 选择特定行的特定列
print("选择索引 'b' 的 name 和 score 列:")
print(df.loc['b', ['name', 'score']])
print()
# 选择多行多列
print("选择索引 'a', 'c' 的 name 和 age 列:")
print(df.loc[['a', 'c'], ['name', 'age']])
print()
# 选择所有行的特定列
print("所有行的 name 和 grade 列:")
print(df.loc[:, ['name', 'grade']])
print()
# 行切片和列切片结合
print("索引 'b' 到 'd' 的 name 到 score 列:")
print(df.loc['b':'d', 'name':'score'])
运行结果:
选择索引 'b' 的 name 和 score 列:
name Bob
score 92
Name: b, dtype: object
选择索引 'a', 'c' 的 name 和 age 列:
name age
a Alice 18
c Charlie 17
所有行的 name 和 grade 列:
name grade
a Alice A
b Bob A
c Charlie B
d David A
e Eve B
索引 'b' 到 'd' 的 name 到 score 列:
name age score
b Bob 19 92
c Charlie 17 78
d David 18 90
代码解析:
df.loc['b', ['name', 'score']]选择特定行的特定列,返回一个 Series。df.loc[['a', 'c'], ['name', 'age']]选择多行多列,返回 DataFrame。df.loc[:, ['name', 'grade']]冒号表示选择所有行。df.loc['b':'d', 'name':'score']同时使用行和列的切片。
示例 4:使用布尔条件选择
loc[] 支持使用布尔数组或条件表达式来筛选数据,这是非常强大的功能。
实例
import pandas as pd
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88],
'grade': ['A', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data)
# 使用布尔条件选择分数大于 85 的行
print("分数大于 85 的学生:")
print(df.loc[df['score'] > 85])
print()
# 复合条件:分数大于 85 且年龄小于 19
print("分数大于 85 且年龄小于 19 的学生:")
print(df.loc[(df['score'] > 85) & (df['age'] 85, ['name', 'score']])
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88],
'grade': ['A', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data)
# 使用布尔条件选择分数大于 85 的行
print("分数大于 85 的学生:")
print(df.loc[df['score'] > 85])
print()
# 复合条件:分数大于 85 且年龄小于 19
print("分数大于 85 且年龄小于 19 的学生:")
print(df.loc[(df['score'] > 85) & (df['age'] 85, ['name', 'score']])
运行结果:
分数大于 85 的学生:
name age score grade
1 Bob 19 92 A
3 David 18 90 A
4 Eve 20 88 B
分数大于 85 且年龄小于 19 的学生:
name age score grade
3 David 18 90 A
使用布尔数组选择的行:
name age score grade
0 Alice 18 85 A
2 Charlie 17 78 B
4 Eve 20 88 B
分数大于 85 的学生的 name 和 score:
name score
1 Bob 92
3 David 90
4 Eve 88
代码解析:
df.loc[df['score'] > 85]使用布尔条件筛选,返回满足条件的行。- 复合条件需要用圆括号括起来,并用
&(与)和|(或)连接。 - 可以直接传入布尔数组(长度必须与行数相同)来选择行。
- 条件后面还可以跟列选择,实现精细的数据筛选。
注意事项
loc[]使用的是标签索引,切片是两端包含的(不同于 Python 原生切片)。- 如果传入的标签不存在,会抛出 KeyError 错误。
- 布尔条件中,复合条件必须使用圆括号,且用
&和|而不是 Python 的and和or。 loc[]读取和修改数据都很方便,但在大数据场景下要注意性能。
重要提示:
loc[]和iloc[]是两个不同的索引器,虽然看起来相似,但原理完全不同:loc[]基于标签,iloc[]基于位置。在使用时要根据实际情况选择合适的索引器。
小结
loc[] 是 Pandas 中基于标签的数据选择器,它提供了直观、灵活的数据访问方式。通过行标签和列标签的组合,我们可以精确地选择任何需要的数据。
它的主要优势包括:使用自定义索引使代码更易读、支持两端包含的切片语法、能够结合布尔条件进行复杂筛选。在实际数据分析中,loc[] 是日常使用频率最高的索引方式之一。

Pandas 常用函数