尽管按名称选择列很简单,但 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 是您选择数据的工具。它支持按标签选择单个项、项列表和切片(包含末端),使您的选择逻辑清晰。