第四章:数据选择与过滤 第四章:Pandas 数据选择与过滤 4.1 基于标签的选择( ) 方法主要基于标签(行索引和列名)进行数据选择。 4.1.1 选择单行/单列 代码详解: : 选择索引为 'A' 的行。返回一个 Series,其索引是 DataFrame 的列名。 : 选择列名为 'Name' 的列。 表示选择所有行。返回一个 Series,其索引是 DataFrame 的行索引。 4.1.2 选择多行/多列 代码详解: : 选择索引为 'A' 和 'B' 的行。注意,这里需要使用一个列表 来指定多个行索引。 : 选择列名为 'Name' 和 'Age' 的列。同样,使用列表 来指定多个列名。 : 同时选择指定的行和列。 4.1.3 使用切片选择 代码详解: : 使用切片选择行。
.loc[]).loc[] 方法主要基于标签(行索引和列名)进行数据选择。
import pandas as pd # 创建一个 DataFrame data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'], 'Age': [25, 30, 28, 22], 'City': ['New York', 'London', 'Paris', 'Tokyo']} df = pd.DataFrame(data, index=['A', 'B', 'C', 'D']) print("原始DataFrame:\n", df) # 选择索引为 'A' 的行 row_a = df.loc['A'] print("\n选择索引为 'A' 的行:\n", row_a) # 选择列名为 'Name' 的列 # 注意:.loc[] 主要用于行选择,列选择通常直接使用 df['列名'] # 为了保持一致性,可以使用 .loc[:, 'Name'] col_name = df.loc[:, 'Name'] print("\n选择列名为 'Name' 的列:\n", col_name)
代码详解:
df.loc['A']: 选择索引为 'A' 的行。返回一个 Series,其索引是 DataFrame 的列名。
df.loc[:, 'Name']: 选择列名为 'Name' 的列。: 表示选择所有行。返回一个 Series,其索引是 DataFrame 的行索引。
# 选择索引为 'A' 和 'B' 的行 rows_ab = df.loc[['A', 'B']] print("\n选择索引为 'A' 和 'B' 的行:\n", rows_ab) # 选择列名为 'Name' 和 'Age' 的列 cols_name_age = df.loc[:, ['Name', 'Age']] print("\n选择列名为 'Name' 和 'Age' 的列:\n", cols_name_age) # 选择索引为 'A' 和 'B' 的行,以及列名为 'Name' 和 'Age' 的列 subset = df.loc[['A', 'B'], ['Name', 'Age']] print("\n选择索引为 'A' 和 'B' 的行,以及列名为 'Name' 和 'Age' 的列:\n", subset)
代码详解:
df.loc[['A', 'B']]: 选择索引为 'A' 和 'B' 的行。注意,这里需要使用一个列表 ['A', 'B'] 来指定多个行索引。
df.loc[:, ['Name', 'Age']]: 选择列名为 'Name' 和 'Age' 的列。同样,使用列表 ['Name', 'Age'] 来指定多个列名。
df.loc[['A', 'B'], ['Name', 'Age']]: 同时选择指定的行和列。
# 选择索引 'A' 到 'C' 的行(包含 'C') rows_a_to_c = df.loc['A':'C'] print("\n选择索引 'A' 到 'C' 的行(包含 'C'):\n", rows_a_to_c) # 选择列 'Name' 到 'City' 的列(包含 'City') cols_name_to_city = df.loc[:, 'Name':'City'] print("\n选择列 'Name' 到 'City' 的列(包含 'City'):\n", cols_name_to_city)
代码详解:
df.loc['A':'C']: 使用切片选择行。注意,.loc[] 的切片是包含结束位置的。
df.loc[:, 'Name':'City']: 使用切片选择列。同样,切片包含结束位置。
.iloc[]).iloc[] 方法主要基于整数位置(行索引和列索引)进行数据选择。
# 选择第一行(索引为 0) row_0 = df.iloc[0] print("\n选择第一行(索引为 0):\n", row_0) # 选择第一列(索引为 0) col_0 = df.iloc[:, 0] print("\n选择第一列(索引为 0):\n", col_0)
代码详解:
df.iloc[0]: 选择索引为 0 的行(即第一行)。
df.iloc[:, 0]: 选择索引为 0 的列(即第一列)。
# 选择第一行和第二行(索引为 0 和 1) rows_0_1 = df.iloc[[0, 1]] print("\n选择第一行和第二行(索引为 0 和 1):\n", rows_0_1) # 选择第一列和第二列(索引为 0 和 1) cols_0_1 = df.iloc[:, [0, 1]] print("\n选择第一列和第二列(索引为 0 和 1):\n", cols_0_1) # 选择第一行和第二行,以及第一列和第二列 subset = df.iloc[[0, 1], [0, 1]] print("\n选择第一行和第二行,以及第一列和第二列:\n", subset)
代码详解:
df.iloc[[0, 1]]: 选择索引为 0 和 1 的行。
df.iloc[:, [0, 1]]: 选择索引为 0 和 1 的列。
df.iloc[[0, 1], [0, 1]]: 同时选择指定的行和列。
# 选择前三行(索引为 0 到 2,不包含 3) rows_0_to_2 = df.iloc[0:3] print("\n选择前三行(索引为 0 到 2,不包含 3):\n", rows_0_to_2) # 选择前两列(索引为 0 到 1,不包含 2) cols_0_to_1 = df.iloc[:, 0:2] print("\n选择前两列(索引为 0 到 1,不包含 2):\n", cols_0_to_1)
代码详解:
df.iloc[0:3]: 使用切片选择行。注意,.iloc[] 的切片是不包含结束位置的。
df.iloc[:, 0:2]: 使用切片选择列。同样,切片不包含结束位置。
布尔索引是 Pandas 中最强大的数据过滤方法之一。它允许我们根据条件表达式选择满足特定条件的行。
# 选择年龄大于 25 的行 age_gt_25 = df[df['Age'] > 25] print("\n选择年龄大于 25 的行:\n", age_gt_25)
代码详解:
df['Age'] > 25: 这是一个布尔表达式,它会返回一个 Series,其中每个元素都是一个布尔值,表示 DataFrame 中对应行的 'Age' 列的值是否大于 25。
df[df['Age'] > 25]: 将上面的布尔 Series 作为索引传递给 DataFrame,从而选择满足条件的行。
# 选择年龄大于 25 且城市为 'London' 的行 age_gt_25_london = df[(df['Age'] > 25) & (df['City'] == 'London')] print("\n选择年龄大于 25 且城市为 'London' 的行:\n", age_gt_25_london) # 选择年龄小于 25 或城市为 'Tokyo' 的行 age_lt_25_tokyo = df[(df['Age'] < 25) | (df['City'] == 'Tokyo')] print("\n选择年龄小于 25 或城市为 'Tokyo' 的行:\n", age_lt_25_tokyo)
代码详解:
&: 逻辑与运算符。用于连接两个布尔表达式,只有当两个表达式都为 True 时,结果才为 True。
|: 逻辑或运算符。用于连接两个布尔表达式,只要两个表达式中有一个为 True,结果就为 True。
注意: 在使用多个条件时,每个条件都需要用括号括起来,以确保正确的运算顺序。
.isin() 方法.isin() 方法用于检查 DataFrame 的列中的值是否包含在指定的列表中。
# 选择城市为 'London' 或 'Tokyo' 的行 city_london_tokyo = df[df['City'].isin(['London', 'Tokyo'])] print("\n选择城市为 'London' 或 'Tokyo' 的行:\n", city_london_tokyo)
代码详解:
df['City'].isin(['London', 'Tokyo']): 返回一个布尔 Series,表示 DataFrame 中每行的 'City' 列的值是否在列表 ['London', 'Tokyo'] 中。.query() 方法.query() 方法允许使用字符串表达式来查询 DataFrame。
# 选择年龄大于 25 的行 age_gt_25_query = df.query('Age > 25') print("\n选择年龄大于 25 的行 (query):\n", age_gt_25_query) # 选择年龄大于 25 且城市为 'London' 的行 age_gt_25_london_query = df.query('Age > 25 and City == "London"') print("\n选择年龄大于 25 且城市为 'London' 的行 (query):\n", age_gt_25_london_query)
代码详解:
df.query('Age > 25'): 使用字符串表达式 'Age > 25' 来查询 DataFrame。
df.query('Age > 25 and City == "London"'): 使用字符串表达式 'Age > 25 and City == "London"' 来查询 DataFrame。注意,字符串需要用双引号括起来。
流程图解释:
开始 (A):流程的起点。
选择数据的方法 (B):选择数据的主要方法有 .loc[]、.iloc[]、布尔索引和 .query()。
基于标签的选择 (.loc[]) (C):使用行和列的标签来选择数据。
基于位置的选择 (.iloc[]) (D):使用行和列的整数位置来选择数据。
布尔索引 (Boolean Indexing) (E):使用条件表达式来过滤数据。
.query() 方法 (F):使用字符串表达式来查询数据。
使用标签选择行和列 (G):.loc[] 的具体操作。
使用整数位置选择行和列 (H):.iloc[] 的具体操作。
使用条件表达式过滤行 (I):布尔索引的具体操作。
使用字符串表达式查询 (J):.query() 方法的具体操作。
返回选择的数据 (K):返回所选数据的 DataFrame 或 Series。
结束 (L):流程的终点。
本章介绍了 Pandas 中数据选择与过滤的各种方法,包括:
.loc[]: 基于标签的选择。
.iloc[]: 基于位置的选择。
布尔索引: 基于条件表达式的选择。
.query(): 使用字符串表达式进行查询。
理解和熟练掌握这些方法,可以帮助你高效地从 Pandas DataFrame 和 Series 中提取所需的数据,为后续的数据分析和处理打下坚实的基础。选择哪种方法取决于你的具体需求和个人偏好。通常来说:
如果需要基于标签进行选择,使用 .loc[]。
如果需要基于位置进行选择,使用 .iloc[]。
如果需要根据条件表达式进行过滤,使用布尔索引。
如果喜欢使用字符串表达式进行查询,可以使用 .query()。
希望本章内容能够帮助你更好地理解和应用 Pandas 中的数据选择与过滤技术。