pandas.DataFrame.query#
- DataFrame.query(expr, *, inplace=False, **kwargs)[源代码]#
使用布尔表达式查询 DataFrame 列。
- Parameters:
- exprstr
要评估的查询字符串。
您可以通过在变量名前加上
@字符来引用环境中的变量,例如@a + b。您可以通过将无效的 Python 变量名的列名括在反引号中来引用它们。因此,包含空格或标点符号(下划线除外)或以数字开头的列名必须括在反引号中。(例如,名为 “Area (cm^2)” 的列将被引用为
`Area (cm^2)`)。不能使用 Python 关键字(如 “list”, “for”, “import” 等)作为列名。例如,如果您的其中一列名为
a a,并且您想将其与b相加,则您的查询应该是`a a` + b。- inplacebool
是修改 DataFrame 还是创建新的 DataFrame。
- **kwargs
有关
eval()接受的关键字参数的完整详细信息,请参阅DataFrame.query()的文档。
- Returns:
- DataFrame 或 None
由提供的查询表达式产生的 DataFrame,如果
inplace=True则为 None。
参见
eval计算描述 DataFrame 列操作的字符串。
DataFrame.eval计算描述 DataFrame 列操作的字符串。
Notes
此表达式的评估结果首先传递给
DataFrame.loc,如果由于多维键(例如 DataFrame)而失败,则结果将传递给DataFrame.__getitem__()。此方法使用顶层
eval()函数来评估传递的查询。query()方法默认使用稍作修改的 Python 语法。例如,&和 ``|``(按位)运算符具有其布尔对应项and和or的优先级。这在语法上是有效的 Python,但语义不同。您可以将
parser='python'关键字参数传递给此函数来更改表达式的语义。这强制执行与 Python 空间中评估相同的语义。同样,您可以传递engine='python'来使用 Python 本身作为后端来评估表达式。不建议这样做,因为它与使用numexpr作为引擎相比效率低下。DataFrame.index实例的DataFrame.columns和DataFrame属性默认放置在查询命名空间中,这允许您将 DataFrame 的索引和列都视为 DataFrame 中的列。标识符index用于 DataFrame 索引;您也可以使用索引的名称在查询中标识它。请注意,Python 关键字不能用作标识符。有关更多详解和示例,请参阅 indexing 中的
query文档。反引号引用的变量
反引号引用的变量被解析为字面 Python 代码,并在内部转换为 Python 有效标识符。这可能导致以下问题。
在解析过程中,反引号字符串中的一些不允许的字符将被替换为允许作为 Python 标识符的字符串。这些字符包括 Python 中的所有运算符、空格、问号、感叹号、美元符号和欧元符号。对于落在 ASCII 范围(U+0001..U+007F)之外的其他字符以及 PEP 3131 中未进一步指定的字符,查询解析器将引发错误。这排除了空格以外的空白字符,但也有哈希符号(因为它用于注释)和反引号本身(反引号也不能被转义)。
在一种特殊情况下,成对包围反引号的引号会混淆解析器。例如,
`it's` > `that's`将引发错误,因为它会形成一个带内部反引号的被引字符串('s > `that')。另请参阅有关词法分析的 Python 文档 (https://docs.python.org/3/reference/lexical_analysis.html) 以及
pandas.core.computation.parsing中的源代码。Examples
>>> df = pd.DataFrame({'A': range(1, 6), ... 'B': range(10, 0, -2), ... 'C C': range(10, 5, -1)}) >>> df A B C C 0 1 10 10 1 2 8 9 2 3 6 8 3 4 4 7 4 5 2 6 >>> df.query('A > B') A B C C 4 5 2 6
前面的表达式等效于
>>> df[df.A > df.B] A B C C 4 5 2 6
对于名称中包含空格的列,您可以使用反引号引用。
>>> df.query('B == `C C`') A B C C 0 1 10 10
前面的表达式等效于
>>> df[df.B == df['C C']] A B C C 0 1 10 10