
本文探讨了在使用 pandas 的 `df.query` 方法时,如何正确处理包含空格的列名以避免 `keyerror`。当列名不符合 python 变量命名规范时(例如含有空格),需要使用反引号(`)将其包裹起来,以确保 `query` 方法能正确识别并执行数据筛选操作,从而实现高效的数据筛选。
Pandas 的 DataFrame.query() 方法提供了一种使用字符串表达式来筛选 DataFrame 行的便捷方式。它通常比使用布尔索引(如 df.loc[])更具可读性,尤其是在涉及多个条件时。query() 方法能够直接引用 DataFrame 的列名作为变量,并在其内部执行表达式。
例如,筛选 Speed 列小于等于 10 的行,可以直接写成:
import pandas as pd
# 示例数据(替代实际加载,方便演示)
data = {'Name': ['Bulbasaur', 'Charmander', 'Squirtle', 'Pikachu', 'Charizard'],
'Type 1': ['Grass', 'Fire', 'Water', 'Electric', 'Fire'],
'Type 2': ['Poison', None, None, None, 'Flying'],
'Speed': [45, 65, 43, 90, 100]}
df = pd.DataFrame(data)
df.query("Speed <= 10")这段代码会顺利执行,因为 Speed 是一个符合 Python 变量命名规则的列名。
然而,当列名中包含空格或其他特殊字符时,直接在 query() 表达式中引用这些列名会导致 KeyError。例如,如果尝试筛选 Type 1 为 "Fire" 且 Type 2 为 "Flying" 的宝可梦,并使用如下代码:
df.query("'Type 1' == 'Fire' and 'Type 2' == 'Flying'")这将抛出一个 KeyError,错误信息可能类似 KeyError: False。这是因为 query() 方法在解析字符串表达式时,会尝试将 Type 1 和 Type 2 视为 Python 变量名。而 Type 1 和 Type 2 并不是合法的 Python 变量名(Python 变量名不能包含空格),导致 query 引擎无法正确识别这些列。
相比之下,使用 df.loc 进行布尔索引时,这种问题不会出现:
df.loc[(df['Type 1'] == "Fire") & (df['Type 2'] == "Flying")]
df.loc 直接通过 df['Column Name'] 的方式访问列,这里的 'Column Name' 是一个字符串字面量,Pandas 会直接将其解析为 DataFrame 的列名,而不会尝试将其作为 Python 变量名进行求值。
为了解决 query() 方法中含空格列名的问题,Pandas 提供了使用反引号 (`) 来包裹这些列名的机制。反引号告诉 query 引擎,其内部的字符串应该被视为字面列名,即使它不符合标准的 Python 变量命名规则。
正确的写法如下:
df.query("`Type 1` == 'Fire' and `Type 2` == 'Flying'")使用上述代码,query() 方法将能够正确识别 Type 1 和 Type 2 这两个列,并返回符合条件的行。
完整示例代码:
import pandas as pd
# 示例数据
data = {'Name': ['Bulbasaur', 'Charmander', 'Squirtle', 'Pikachu', 'Charizard', 'Moltres', 'Ho-oh', 'Talonflame'],
'Type 1': ['Grass', 'Fire', 'Water', 'Electric', 'Fire', 'Fire', 'Fire', 'Fire'],
'Type 2': ['Poison', None, None, None, 'Flying', 'Flying', 'Flying', 'Flying'],
'Total': [318, 309, 314, 320, 534, 580, 680, 499],
'HP': [45, 39, 44, 35, 78, 90, 106, 78],
'Attack': [49, 52, 48, 55, 84, 100, 130, 81],
'Defense': [49, 43, 65, 40, 78, 90, 90, 71],
'Sp. Atk': [65, 60, 50, 50, 109, 125, 110, 74],
'Sp. Def': [65, 50, 64, 50, 85, 85, 154, 69],
'Speed': [45, 65, 43, 90, 100, 90, 90, 126],
'Generation': [1, 1, 1, 1, 1, 1, 2, 6],
'Legendary': [False, False, False, False, False, True, True, False]}
df = pd.DataFrame(data)
print("原始 DataFrame 头部:")
print(df.head())
print("\nDataFrame 列名列表:")
print(df.columns.tolist())
# 使用 .loc 方法 (作为对比,功能正常)
print("\n使用 .loc 筛选 'Type 1' == 'Fire' and 'Type 2' == 'Flying':")
result_loc = df.loc[(df['Type 1'] == "Fire") & (df['Type 2'] == "Flying")]
print(result_loc)
# 尝试使用错误的 .query 方法 (会引发 KeyError,此部分被注释以避免程序中断)
# print("\n尝试使用错误的 .query 方法:")
# try:
# df.query("'Type 1' == 'Fire' and 'Type 2' == 'Flying'")
# except KeyError as e:
# print(f"捕获到 KeyError: {e} - 这是因为列名 'Type 1' 和 'Type 2' 包含空格。")
# 使用正确的 .query 方法 (使用反引号)
print("\n使用正确的 .query 方法 (使用反引号) 筛选 'Type 1' == 'Fire' and 'Type 2' == 'Flying':")
result_query = df.query("`Type 1` == 'Fire' and `Type 2` == 'Flying'")
print(result_query)Pandas.DataFrame.query() 方法是一个强大且富有表现力的数据筛选工具。理解其内部机制,特别是在处理不符合 Python 变量命名规则的列名时如何使用反引号,是高效利用此方法的关键。通过遵循本文提供的指南,开发者可以避免常见的 KeyError,并更流畅地进行数据分析工作。
以上就是Pandas query方法:处理含空格列名的实用指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号