我正在使用一个子类化的DataFrame,以便可以更方便地访问某些针对我的用例的转换方法和元数据。大多数DataFrame操作按预期方式工作,因为它们返回子类的实例,而不是pandas.DataFrame
的实例。但是,诸如DataFrame.groupby
和DataFrame.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
答案 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