Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-pandas中的重载_Python_Pandas_Overloading - Fatal编程技术网

python-pandas中的重载

python-pandas中的重载,python,pandas,overloading,Python,Pandas,Overloading,我正在构建一个数据库类型的对象,当找不到索引时,它使用api检索信息,将其保存到对象/文件并返回 我想通过重载pandas DataFrame的.loc[x,y]方法来实现这一点,但我不知道如何做到这一点 目前我有: import pandas as pd pd.set_option('io.hdf.default_format','table') class DataBase(pd.DataFrame): """DataBase Object which can be updated

我正在构建一个数据库类型的对象,当找不到索引时,它使用api检索信息,将其保存到对象/文件并返回

我想通过重载pandas DataFrame的
.loc[x,y]
方法来实现这一点,但我不知道如何做到这一点

目前我有:

import pandas as pd
pd.set_option('io.hdf.default_format','table')

class DataBase(pd.DataFrame):
    """DataBase Object which can be updated by external api"""
    def __init__(self, path, api=None):
        super(DataBase, self).__init__(pd.read_hdf('store.h5','df'))
        self.api = api
我可能想更改
\uuu init\uu
函数,使其包含
where
参数,以便只读取需要的内容

我想不出一种方法来正确地重载
.loc
方法


此外,hdf5只是一种方法。我想保留使用任何其他存储方法的能力,如sql,甚至csv(如果需要)

loc
是一个属性,它创建并返回一个名为
\u loc
的名称,如果它不是
None
,则它会根据需要创建一个
pandas.core.index.\u LocIndexer
。默认情况下,索引器可以访问创建它们的数据帧,因此您可以在未命中关键帧时修改数据帧

您可以通过子类化
DataFrame
\LocIndexer
来覆盖
DataFrame.loc
的行为

class MyLocIndexer(_LocIndexer):    
    def __getitem__(self, key):
        try:                   
            return super().__getitem__(key)
        except KeyError:
            item = db.fetch_item(key)
            self[key] = item
            return item
            # `return self[key]' is better as it also works when accessing a 
            # whole axis

class MyDataFrame(DataFrame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._loc = MyLocIndexer(self, "loc")

上面的内容是用python3编写的,因此如果使用python2,您必须修复super语句。

再加上几年后的答案,如果您最终重载了基本pandas类,您可以重写一些构造函数属性,以确保通过标准pandas操作来维持新类,从:

  • _构造函数:当操作结果与原始结果具有相同的维度时使用
  • _构造函数_sliced:当操作结果有一个较低的维度作为原始维度时使用,例如DataFrame single columns 切片
  • _构造函数_expanddim:当操作结果具有比原始结果更高的维度时使用,例如Series.to_frame()和 DataFrame.to_面板()
e、 g:


正如您所看到的,loc不是一个方法而是一个属性,而属性又有自己的get方法。所以答案是,这很复杂。不,我看不见。我在文档或核心文件中找不到任何关于
.loc
的有用信息。我内省的方法只是使用ipython控制台的“?”。无论如何,它已经在语法中了:方法是thing.do();但是属性/属性看起来像thing.other和该操作结束时对该属性执行的任何操作
pd.core.indexing.\u LocationIndexer
及其派生工具有一些作用于loc.obj的get方法,因此您可以找到为数据帧选择的方法,对其进行子类化,并重载getter。子类化是什么意思?稍后我将尝试为您提供解决方案。
@property
def _constructor(self):
    return MyDataFrame