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__不能给出答案。
>>> 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并更改了路径
columns没有在任何地方定义。它只是 DataFrame 上的一个属性,指向另一个对象的实例。特别是,必须是其子类之一columns的实例,这些子类也在 的子模块中定义,但也大多可以从顶级模块访问(例如)。pandas.core.indexes.base.Indexpandas.core.indexespd.RangeIndex
我将“定义”与两个可能相关的想法区分开来:
self.columns = ...)。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类(而不是实例)以具有属性columns和index。
特别是,_setup_axes 将属性设置为columnswith AxisPropertyargument axis=0。您也许可以将其视为_setup_axes一个承诺,即每个实例DataFrame都有两个轴的标签,并且这些轴都有名称。
那么为什么调用会df.columns返回 Index 而不是 呢AxisProperty?
致电df.columns意愿:
__getattr__。columns条目,self._internal_names_set然后转到第5270行return object.__getattribute__(self, name).__get__方法AxisProperty。请注意,这里的第二个参数 ( obj) 是我们的 DataFrame 实例(!)。obj._data.axes,即_data[.axes]数据帧的属性。obj._data.axes上返回对应于 的元素self.axis。_setup_axes对had set 的调用self.axis=0使我们得到了第 0 个元素。设置df.columns(初始化后)的工作方式类似。当 DataFrame 初始化时,列被强制转换为一种Index类型,添加到轴列表中,并作为参数传递给 init a BlockManager,然后将其分配给_data属性。
| 归档时间: |
|
| 查看次数: |
159 次 |
| 最近记录: |