趋近智
尽管按名称选择列很简单,但 Pandas 提供了更强大的机制来选择行或行与列的组合。主要的基于标签的选择方法是 .loc 访问器。可以将 .loc 视为根据数据的“名称”或“标签”进行选择 — 无论是您赋予行的名称(其索引标签)还是列的名称。
这与按数字位置选择不同,我们将在下一节中使用 .iloc 来介绍。只要标签保持一致,使用标签可以使您的代码更易读,并且在数据顺序改变时更不容易出错。
基本语法涉及在 .loc 之后,将所需的行标签和(可选的)列标签放在方括号 [] 中传入:
# 一般语法
# dataframe.loc[行_标签_选择器, 列_标签_选择器]
我们来创建一个示例 DataFrame 来展示 .loc 如何工作。假设我们有几天的天气数据:
import pandas as pd
import numpy as np
data = {'Temperature': [25, 28, 22, 31, 29],
'Humidity': [60, 55, 70, 50, 65],
'WindSpeed': [10, 12, 8, 15, 11]}
index_labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']
weather_df = pd.DataFrame(data, index=index_labels)
print(weather_df)
Temperature Humidity WindSpeed
Mon 25 60 10
Tue 28 55 12
Wed 22 70 8
Thu 31 50 15
Fri 29 65 11
要选择单行,将其索引标签传给 .loc。结果将是一个 Pandas Series,其索引是原始 DataFrame 的列名。
# 选择索引标签为 'Wed' 的行
wednesday_data = weather_df.loc['Wed']
print(wednesday_data)
print(type(wednesday_data))
Temperature 22
Humidity 70
WindSpeed 8
Name: Wed, dtype: int64
<class 'pandas.core.series.Series'>
您可以通过提供一个索引标签列表来选择多个特定行。结果是一个只包含指定行的新 DataFrame。
# 选择 'Mon' 和 'Fri' 的行
mon_fri_data = weather_df.loc[['Mon', 'Fri']]
print(mon_fri_data)
print(type(mon_fri_data))
Temperature Humidity WindSpeed
Mon 25 60 10
Fri 29 65 11
<class 'pandas.core.frame.DataFrame'>
.loc 也支持使用索引标签进行切片。与标准 Python 切片或基于位置的切片(我们将在 .iloc 中看到)的一个重要区别是,使用 .loc 进行的基于标签的切片包含起始和结束标签。
# 选择从 'Tue' 到 'Thu' (包括 'Thu') 的行
tue_to_thu_data = weather_df.loc['Tue':'Thu']
print(tue_to_thu_data)
Temperature Humidity WindSpeed
Tue 28 55 12
Wed 22 70 8
Thu 31 50 15
注意,标签为 'Thu' 的行被包含在输出中。这种包含性行为仅在使用标签进行切片时适用。
当您按标签同时选择行和列时,.loc 的真正作用就体现出来了。您首先提供行选择器,然后是一个逗号,再是列选择器。
# 选择星期三的气温
temp_wed = weather_df.loc['Wed', 'Temperature']
print(f"星期三气温: {temp_wed}\n")
# 选择星期一和星期二的湿度和风速
hum_wind_mon_tue = weather_df.loc[['Mon', 'Tue'], ['Humidity', 'WindSpeed']]
print(hum_wind_mon_tue, "\n")
# 选择所有行,但只选择 'Temperature' 和 'Humidity' 列
temp_humidity = weather_df.loc[:, ['Temperature', 'Humidity']]
print(temp_humidity, "\n")
# 选择从 'Wed' 到 'Fri' 的行以及从 'Humidity' 到 'WindSpeed' 的列(包含切片)
subset_slice = weather_df.loc['Wed':'Fri', 'Humidity':'WindSpeed']
print(subset_slice)
星期三气温: 22
Humidity WindSpeed
Mon 60 10
Tue 55 12
Temperature Humidity
Mon 25 60
Tue 28 55
Wed 22 70
Thu 31 50
Fri 29 65
Humidity WindSpeed
Wed 70 8
Thu 50 15
Fri 65 11
在上面的第三个示例中,行位置 weather_df.loc[:, ['Temperature', 'Humidity']] 中使用的冒号 : 表示“选择所有行”。同样,您可以在列位置使用 : 来选择特定行的所有列。
.loc 与布尔条件一起使用尽管后面有一个专门讲布尔索引的部分,但知道 .loc 可以用于行选择的布尔数组 (Series) 是有益的。您可以创建一个条件,该条件会产生一个由 True/False 值组成的 Series,然后将这个 Series 传给 .loc。它将只返回条件为 True 的行。
# 选择气温高于 25 度的日期
hot_days = weather_df.loc[weather_df['Temperature'] > 25]
print(hot_days)
Temperature Humidity WindSpeed
Tue 28 55 12
Thu 31 50 15
Fri 29 65 11
这里,weather_df['Temperature'] > 25 创建了一个布尔 Series:
Mon False
Tue True
Wed False
Thu True
Fri True
Name: Temperature, dtype: bool
将这个 Series 传给 weather_df.loc[...] 会有效地选择对应 True 值的行。
请记住,.loc 总是作用于索引和列的标签。如果您的 DataFrame 具有默认的整数索引 (0, 1, 2, ...),那么 .loc 会将这些整数用作标签。
df_int_index = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
print(df_int_index)
# 选择索引标签为 1 的行
print("\n标签为 1 的行:")
print(df_int_index.loc[1])
A B
0 1 4
1 2 5
2 3 6
标签为 1 的行:
A 2
B 5
Name: 1, dtype: int64
尽管 1 看起来像一个位置,但在此情境下,.loc 将其视为该行的名称或标签。这有时会让人困惑,这也是为什么纯粹基于位置的 .iloc 访问器存在的原因,我们将在后面看到。
总之,当您知道所需行和列的名称(标签)时,.loc 是您选择数据的工具。它支持按标签选择单个项、项列表和切片(包含末端),使您的选择逻辑清晰。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造