HOWTO · Pandas
在 Pandas 中获取列与特定值匹配的行的索引
本文介绍了如何在 Pandas 中获取列符合特定值的行的索引。
本页内容
要获取符合条件的行,请创建布尔掩码,并将其传递给 DataFrame.loc。如果只需要这些行的标签,则将同一个掩码应用于 DataFrame.index;需要普通 Python 列表时,调用 tolist()。索引标签用于标识行,不一定是连续的整数位置。重复使用同一个掩码,可以确保筛选出的行与对应标签保持一致,即使 DataFrame 使用了自定义标签也是如此。若要继续处理匹配的记录,请使用 DataFrame.loc;若所需结果就是标签,则使用索引表达式。
在 Pandas 中按数值条件筛选行
此示例先选择列 B 等于 19 的行,再将这一条件与列 C 的 OR 条件组合起来。DataFrame.loc 返回匹配的行,DataFrame.index 返回这些行的标签。每个比较条件都加上括号,可以清楚地表达组合后的布尔条件。在实际使用时,请将示例中的列名和值替换为数据中的对应内容;使用 | 或 & 组合掩码时,每个比较条件都应加上括号,这样 Python 才会对每个布尔 Series 执行预期的运算。
import numpy as np
import pandas as pd
np.random.seed(0)
df = pd.DataFrame(np.random.randint(1, 20, size=(20, 4)), columns=list("ABCD"))
matches_b = df["B"] == 19
print(df.loc[matches_b])
print(df.index[matches_b].tolist())
matches_b_or_c = (df["B"] == 19) | (df["C"] == 19)
print(df.loc[matches_b_or_c])
print(df.index[matches_b_or_c].tolist())
A B C D
6 1 19 4 18
9 12 19 3 1
[6, 9]
A B C D
6 1 19 4 18
9 12 19 3 1
14 12 15 19 1
[6, 9, 14]
第一个掩码选择 B 值为 19 的行,其标签为 [6, 9]。第二个掩码使用 OR(|),因此 B 或 C 任一列的值为 19 时,该行就会被选中;对应标签为 [6, 9, 14]。如果两个条件都必须成立,请在加了括号的条件之间使用 &。这些值是索引标签,而不是行的位置;即使 DataFrame 经过筛选或使用了自定义索引,标签仍可用于标识行。DataFrame.index 是属性而不是方法;tolist() 会将选中的标签转换为 Python 列表,且不依赖特定的 pandas 索引类。如果原始标签不唯一,结果中可能出现重复标签,因为每个匹配行都会贡献自己的索引标签。
在 Pandas 中获取字符串匹配行的索引
字符串筛选也使用相同的模式:将列与完整值比较以进行精确匹配,或使用 str.contains 查找子字符串。需要单元格的整个值完全相同时,精确匹配很有用;如果单元格中可能还包含其他文本,则适合使用子字符串匹配。下面的示例会同时获取匹配的行及其标签。子字符串条件使用小写的 rex,它与 Tyrannosaurus rex 中的大小写一致。
import pandas as pd
df = pd.DataFrame(
{
"Name": ["blue", "delta", "echo", "charlie", "alpha"],
"Type": ["Raptors", "Raptors", "Raptors", "Raptors", "Tyrannosaurus rex"],
}
)
exact_name = df["Name"] == "blue"
print(df.index[exact_name].tolist())
print(df.loc[exact_name])
name_contains_ha = df["Name"].str.contains("ha")
print(df.index[name_contains_ha].tolist())
print(df.loc[name_contains_ha])
name_contains_ha_and_type_contains_rex = name_contains_ha & df["Type"].str.contains("rex")
print(df.loc[name_contains_ha_and_type_contains_rex])
[0]
Name Type
0 blue Raptors
[3, 4]
Name Type
3 charlie Raptors
4 alpha Tyrannosaurus rex
Name Type
4 alpha Tyrannosaurus rex
精确匹配会找到 blue,并返回它的标签。子字符串 ha 会匹配 charlie 和 alpha;再将它与 Type 列中的 rex 条件组合后,就会选中 alpha 行,其标签为 [4]。str.contains 默认区分大小写,因此应让搜索文本的大小写与数据一致,或明确设置其 case 选项。两个条件都必须匹配时用 & 组合;任一条件匹配即可时用 | 组合;每个比较条件都要加上括号。与数值筛选一样,将掩码传给 DataFrame.loc 可获取行,传给 DataFrame.index 可获取标签。若要对其他列进行精确匹配,可以更改列名和比较值;子字符串写法的结构不变,只需替换搜索文本。