pandas Dataframe.loc 如何接受 [...] 语法?

Mic*_*l S 7 python pandas

我已阅读此文档:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.loc.html

您可以使用类似的语法df.loc[df['shield'] > 6, ['max_speed']]

我尝试使用 Github 并发现:

假设您有一个pandas.core.frame.DataFrame对象,即一个DataFrame被调用的对象df

的类型df.locpandas.core.indexing._LocIndexer

尽管如此,我还是无法理清这些问题:

  1. 您如何使 Python 函数/类接受上述语法?

  2. pandas.core.frame.DataFrame属性在源代码中的哪里self.loc定义?

Ale*_*x L 5

(1)你如何使一个类接受普遍认为语法是通过实施__getitem__https://docs.python.org/3/reference/datamodel.html#object。的GetItem),这是操作符重载的例子。这允许该类的对象被索引[]。例如:

class get_item_example(object):
 def __getitem__(self, key):
         print(key)
Run Code Online (Sandbox Code Playgroud)

试试看:

>>> gi = get_item_example()
>>> gi['a']
a
>>> gi[['a','b','c']]
['a', 'b', 'c']
>>> gi['a','b','c']
('a', 'b', 'c')
Run Code Online (Sandbox Code Playgroud)

df.loc[df['shield'] > 6, ['max_speed']]发生的情况是,传递给的键__getitem__是一个包含由返回的熊猫系列df['shield'] > 6和单个项目列表的元组['max_speed']

(2) 在pandas 源码中,pandas.core.indexing._LocIndexer继承了__getitem__from 的一个实现pandas.core.indexing. _LocationIndexer。实现在这里:

https://github.com/pandas-dev/pandas/blob/61362be9ea4d69b33ae421f1f98b8db50be611a2/pandas/core/indexing.py#L1374