熊猫groupby,重新采样等,用于子类DataFrame

时间:2019-09-04 22:51:38

标签: python pandas dataframe subclassing

我正在使用一个子类化的DataFrame,以便可以更方便地访问某些针对我的用例的转换方法和元数据。大多数DataFrame操作按预期方式工作,因为它们返回子类的实例,而不是pandas.DataFrame的实例。但是,诸如DataFrame.groupbyDataFrame.resample之类的聚合操作似乎将其弄乱了。

这是错误,还是在定义子类时遗漏了某些东西?

下面是一个最小的示例,已在熊猫0.25.1上进行了测试:

class MyDataFrame(pd.DataFrame):
    @property
    def _constructor(self):
        return MyDataFrame

dates = pd.date_range('2019', freq='D', periods=365)
my_df = MyDataFrame(range(len(dates)), index=dates)

assert isinstance(my_df, MyDataFrame)
# Success!

assert isinstance(my_df.diff(), MyDataFrame)
# Success!

assert isinstance(my_df.sample(10), MyDataFrame)
# Success!

assert isinstance(my_df[:10], MyDataFrame)
# Success!

assert isinstance(my_df.resample("D").sum(), MyDataFrame)
# AssertionError

assert isinstance(my_df.groupby(df.index.month).sum(), MyDataFrame)
# AssertionError

1 个答案:

答案 0 :(得分:3)

我不知道它本身是否是一个“错误”,但是我同意无论如何都应该对其进行更改。如果查看groupby-type对象的一些source code,您会看到很多硬编码的return DataFrame(...)return Series(...)

正如您正确指出的那样,Pandas对象具有三种用于构造自身新版本的方法:

  • _construct()创建相同类型的对象
  • _construct_sliced()从类似数据框的对象中创建类似序列的对象
  • _construct_expanddim()从类似系列的对象创建类似dataframe的对象

可以使用它们代替core/groupby/generic.py中的硬编码类型,这很容易做到,因为groupby对象将起始NDFrame存储为属性obj

执行了这些更改的分支可以在我的叉子上找到:https://github.com/alkasm/pandas/tree/groupby-preserve-subclass

相关问题