Pandas DataFrame:__getitem__()的完整规范是什么?

16

简短版

对于pandas的Dataframe.__getitem__(),有哪些允许的输入(实际上是输入类型),以及该函数会产生什么结果?

详细信息

问题描述

我想编写能够充分利用DataFrame[],即Dataframe.__getitem__()的代码。为此,我需要了解输入/返回结果的信息,就像在API页面上找到的那样详细,但该方法的API页面上没有提供相关信息。

已经采取的措施

我查找了Pandas API页面上该函数的完整规范。虽然文档中记录了许多其他方法,但没有记录Dataframe.__getitem__()

我还查看了教程,但我不认为它试图做到详尽无遗。

我查看了Dataframe.__getitem__()的源代码(首次尝试在我的答案中进行了描述)。很明显,该函数可以接受各种不同的类型作为输入,但逆向工程代码以确定每种类型传递时会发生什么似乎不是掌握该方法的预期方式。

额外背景信息

Pandas是Python在科学和统计方面最重要的库之一,DataFrame可以说是Pandas中最核心的对象,而[]运算符可以说是DataFrame上最核心的方法。因此,实际回答我在这里发布的问题具有非常高的教育价值,不仅仅是对我有用。


2
你看过http://pandas.pydata.org/pandas-docs/stable/indexing.html吗? - jonrsharpe
3
我不是在寻求建议,我是想问这个函数的权威文档在哪里。这非常具体。答案可能是“文档在xxx处”,或者“没有文档”,或者“开发人员没有创建文档,但Fred Smith创建了一个文档,在xxx处”。不需要任何观点。该函数具有某些明确定义的功能,我希望从权威来源了解这些功能。 - gwideman
3
“*What is the complete spec for what this function accepts and returns?*”这个问题是一个好问题,也很有趣。然而,不幸的是,除了教程文档(http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics)和代码本身之外,没有完整的描述。但是,这肯定是有用的。实际上,已经有关于这个问题的一份记录:https://github.com/pydata/pandas/issues/6920 - joris
1
@JimGarrison 但是由于[ ]的这种用法在DataFrame对象中实现得非常特殊,因此有关此的参考文档将会很有意义。 - joris
1
@gwideman 无论如何(但你完全正确,确实有一些文档缺失),对于更复杂的代码,我总是建议使用.iloc[]/.loc[]来非常明确地区分基于标签和基于位置的索引(因为[]可以根据情况而变化,就像ix一样,只是文档记录得更多一些)。 - joris
显示剩余10条评论
1个回答

9

我怀疑这个函数缺乏文档的一部分是因为源代码中缺少文档注释。如果没有更多用户友好的内容,以下是实际的DataFrame.__getitem__()方法:

def __getitem__(self, key):

    # shortcut if we are an actual column
    is_mi_columns = isinstance(self.columns, MultiIndex)
    try:
        if key in self.columns and not is_mi_columns:
            return self._getitem_column(key)
    except:
        pass

    # see if we can slice the rows
    indexer = _convert_to_index_sliceable(self, key)
    if indexer is not None:
        return self._getitem_slice(indexer)

    if isinstance(key, (Series, np.ndarray, list)):
        # either boolean or fancy integer index
        return self._getitem_array(key)
    elif isinstance(key, DataFrame):
        return self._getitem_frame(key)
    elif is_mi_columns:
        return self._getitem_multilevel(key)
    else:
        return self._getitem_column(key)

... 至少提供了一种顶层分类的关键字(索引)类型,这些类型可以被DataFrame[]接受。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接