python - 如何子类化 Pandas DataFrame?

标签 python pandas dataframe subclassing

对 Pandas 类进行子类化似乎很常见,但我找不到有关该主题的引用资料。 (看来 Pandas 的开发者仍在努力: Easier subclassing #60 。)

关于这个主题有一些 SO 问题,但我希望这里有人可以提供一个更系统的说明,说明当前满足两个一般要求的子类 pandas.DataFrame 的最佳方法:

  1. 在 MyDF 实例上调用标准 DataFrame 方法应该生成 MyDF 实例
  2. 在 MyDF 实例上调用标准 DataFrame 方法应该让所有属性仍附加到输出

(继承 pandas.Series 有什么显着差异吗?)

子类化代码pd.DataFrame:

import numpy as np
import pandas as pd

class MyDF(pd.DataFrame):
    # how to subclass pandas DataFrame?
    pass

mydf = MyDF(np.random.randn(3,4), columns=['A','B','C','D'])
print(type(mydf))  # <class '__main__.MyDF'>

# Requirement 1: Instances of MyDF, when calling standard methods of DataFrame,
# should produce instances of MyDF.
mydf_sub = mydf[['A','C']]
print(type(mydf_sub))  # <class 'pandas.core.frame.DataFrame'>

# Requirement 2: Attributes attached to instances of MyDF, when calling standard
# methods of DataFrame, should still attach to the output.
mydf.myattr = 1
mydf_cp1 = MyDF(mydf)
mydf_cp2 = mydf.copy()
print(hasattr(mydf_cp1, 'myattr'))  # False
print(hasattr(mydf_cp2, 'myattr'))  # False

最佳答案

现在有一个关于如何对 Pandas 数据结构进行子类化的官方指南,其中包括 DataFrame 和 Series。

该指南可在此处获得:https://pandas.pydata.org/pandas-docs/stable/development/extending.html#extending-subclassing-pandas

该指南提到了来自 Geopandas 项目的这个子类 DataFrame 作为一个很好的例子:https://github.com/geopandas/geopandas/blob/master/geopandas/geodataframe.py

在 HYRY 的回答中,您似乎想要完成两件事:

  1. 在您的类实例上调用方法时,返回正确类型(您的类型)的实例。为此,您只需添加应该返回您的类型的 _constructor 属性。
  2. 添加将附加到对象副本的属性。为此,您需要将这些属性的名称存储在一个列表中,作为特殊的 _metadata 属性。

这是一个例子:

class SubclassedDataFrame(DataFrame):
    _metadata = ['added_property']
    added_property = 1  # This will be passed to copies

    @property
    def _constructor(self):
        return SubclassedDataFrame

关于python - 如何子类化 Pandas DataFrame?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22155951/

相关文章:

python - 如何使用panda.read_csv从python中的csv文件导入数据?

python - MySQL 数据未在 Web 应用程序中更新 - Python/Flask

python - 是否有代码可以对列中包含的相似单词进行分组

python - 有没有办法为 pandas groupby 对象保留每个组的子集?

python - 将列移到左侧 Pandas Dataframe

python - 使用 Pandas 删除值高于具有相同 id 的所有行的最小值的行

python - 如何用 Python cartopy 给一个国家贴上标签?

python - list_display带有函数,如何传递参数?

c# - 在特定情况下将 bytearray 转换为字符串

pandas - 可视化 pandas 分组数据