指定数据框的属性定义(例如列)位于哪个文件中?

it_*_*ure 5 package python-3.x pandas

pandas 是一个巨大的python库。

import pandas as pd
pd.__path__
['/usr/local/lib/python3.5/dist-packages/pandas']  
Run Code Online (Sandbox Code Playgroud)

我知道位于/usr/local/lib/python3.5/dist-packages/pandas.

data = {'Name':['Tom', 'nick'], 'Age':[20, 21]} 
df = pd.DataFrame(data) 
df.cloumns
Index(['Age', 'Name'], dtype='object')
Run Code Online (Sandbox Code Playgroud)

columns是数据框的属性,我想知道数据框的属性columns定义在哪里?

ls  /usr/local/lib/python3.5/dist-packages/pandas
api     conftest.py  __init__.py  plotting     tests    _version.py
arrays  core         io           __pycache__  tseries
compat  errors       _libs        testing.py   util
Run Code Online (Sandbox Code Playgroud)

columns归属地位于哪个目录和目录中的哪个文件? df.cloumns.__path__不能给出答案。

the*_*gon 5

>>> import pandas as pd
>>> import inspect
>>> inspect.getfile(pd.DataFrame)
'/Users/.../lib/python3.7/site-packages/pandas/core/frame.py'
Run Code Online (Sandbox Code Playgroud)

DataFrames 将通过__init__以下方式初始化:https :
//github.com/pandas-dev/pandas/blob/v1.0.3/pandas/core/frame.py#L414

具体来说,当从 dict 构造 DataFrame 时,它​​使用@classmethod来实例化 DF:https :
//github.com/pandas-dev/pandas/blob/v1.0.3/pandas/core/frame.py#L1169

@classmethod
def from_dict(cls, data, orient="columns", dtype=None, columns=None) - "DataFrame":
    ...
    return cls(data, index=index, columns=columns, dtype=dtype)
Run Code Online (Sandbox Code Playgroud)

在 github 中检查该文件并认为columns是设置属性的位置:https :
//github.com/pandas-dev/pandas/blob/v1.0.3/pandas/core/frame.py#L8449

DataFrame._setup_axes(
    ["index", "columns"],
    docs={
        "index": "The index (row labels) of the DataFrame.",
        "columns": "The column labels of the DataFrame.",
    },
)
Run Code Online (Sandbox Code Playgroud)

编辑:添加了对稳定熊猫版本的引用def __init__def from_dict并更改了路径

  • JupyterLab 中的上下文帮助选项卡会在悬停时显示每个变量的路径字符串。 (2认同)

web*_*elo 2

columns没有在任何地方定义。它只是 DataFrame 上的一个属性,指向另一个对象的实例。特别是,必须是其子类之一columns的实例,这些子类也在 的子模块中定义,但也大多可以从顶级模块访问(例如)。pandas.core.indexes.base.Indexpandas.core.indexespd.RangeIndex

我将“定义”与两个可能相关的想法区分开来:

  1. 属性设置的位置。(例如他们去的路线,self.columns = ...)。
  2. DataFrame 对象如何使用属性/与属性交互。

在哪里Index定义的?

基类的实际路径Index位于:

https://github.com/pandas-dev/pandas/blob/v1.0.3/pandas/core/indexes/base.py#L177

同样,在您的本地安装中,它将位于

[..]/python3.x/site-packages/pandas/core/indexes/base.py

哪里写着columns必须是 an 的实例Index

由于 python 不是强类型的,这有点难以证明/执行。然而,DataFrame继承自NDFrame,这是它的 N 维推广(Series是一维版本)。最终,NDFrame将数据存储在名为...的属性中_data,该属性是 的实例BlockManager在这里axes您可以看到(columns是一种轴)上的打字是作为Index. 对这些轴的所有(正统)修改都将通过一个函数运行ensure_index,该函数将例如列表转换为适当的索引。

属性是如何column设置和检索的?

(也许这是主要问题?)

引用的索引对象columns位于pd.DataFrame._data.axes[0]. __getattr__然后__setattr__确保调用返回该元素的自定义实现DataFrame.columns

但让我备份一下。

对类方法的调用_setup_axes会更改DataFrame类(而不是实例)以具有属性columnsindex

特别是,_setup_axes 将属性设置columnswith AxisPropertyargument axis=0。您也许可以将其视为_setup_axes一个承诺,即每个实例DataFrame都有两个轴的标签,并且这些轴都有名称。

那么为什么调用会df.columns返回 Index 而不是 呢AxisProperty

致电df.columns意愿:

  1. 进入 __getattr__
  2. 在 中查找columns条目,self._internal_names_set然后转到第5270行
  3. [5270] return object.__getattribute__(self, name).
  4. 的触发__get__方法AxisProperty。请注意,这里的第二个参数 ( obj) 是我们的 DataFrame 实例(!)。
  5. 63 access上obj._data.axes,即_data[.axes]数据帧的属性。
  6. 64obj._data.axes上返回对应于 的元素self.axis_setup_axes对had set 的调用self.axis=0使我们得到了第 0 个元素。

设置df.columns(初始化后)的工作方式类似。当 DataFrame 初始化时,列被强制转换为一种Index类型,添加到轴列表中,并作为参数传递给 init a BlockManager,然后将其分配给_data属性。