现在位置: 首页 > Pandas 教程 > 正文

Pandas df.loc() 函数

Pandas 常用函数 Pandas 常用函数


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:
      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

代码解析:

  1. 默认情况下,DataFrame 的索引是整数 0、1、2、3、4。
  2. df.loc[0] 选择索引标签为 0 的行,返回一个 Series。
  3. df.loc[[1, 3, 4]] 选择多个特定索引的行。
  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:
   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'])

运行结果:

选择索引 '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

代码解析:

  1. df.loc['b', ['name', 'score']] 选择特定行的特定列,返回一个 Series。
  2. df.loc[['a', 'c'], ['name', 'age']] 选择多行多列,返回 DataFrame。
  3. df.loc[:, ['name', 'grade']] 冒号表示选择所有行。
  4. 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']])

运行结果:

分数大于 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

代码解析:

  1. df.loc[df['score'] > 85] 使用布尔条件筛选,返回满足条件的行。
  2. 复合条件需要用圆括号括起来,并用 &(与)和 |(或)连接。
  3. 可以直接传入布尔数组(长度必须与行数相同)来选择行。
  4. 条件后面还可以跟列选择,实现精细的数据筛选。

注意事项

  • loc[] 使用的是标签索引,切片是两端包含的(不同于 Python 原生切片)。
  • 如果传入的标签不存在,会抛出 KeyError 错误。
  • 布尔条件中,复合条件必须使用圆括号,且用 &| 而不是 Python 的 andor
  • loc[] 读取和修改数据都很方便,但在大数据场景下要注意性能。

重要提示:loc[]iloc[] 是两个不同的索引器,虽然看起来相似,但原理完全不同:loc[] 基于标签,iloc[] 基于位置。在使用时要根据实际情况选择合适的索引器。


小结

loc[] 是 Pandas 中基于标签的数据选择器,它提供了直观、灵活的数据访问方式。通过行标签和列标签的组合,我们可以精确地选择任何需要的数据。

它的主要优势包括:使用自定义索引使代码更易读、支持两端包含的切片语法、能够结合布尔条件进行复杂筛选。在实际数据分析中,loc[] 是日常使用频率最高的索引方式之一。

Pandas 常用函数 Pandas 常用函数