【发布时间】:2019-09-04 22:51:38
【问题描述】:
注意:下面的线程提示了一个拉取请求,该请求最终被合并到v1.10。此问题现已解决。
我正在使用子类 DataFrame,以便我可以更方便地访问特定于我的用例的一些转换方法和元数据。大多数 DataFrame 操作都按预期工作,因为它们返回子类的实例,而不是 pandas.DataFrame 的实例。然而,像 DataFrame.groupby 和 DataFrame.resample 这样的聚合操作似乎把这搞砸了。
这是一个错误,还是在定义我的子类时遗漏了什么?
下面是一个最小的例子,在 pandas 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
【问题讨论】:
-
从文档中,GroupBy 返回一个 DataFrameGroupBy 或 SeriesGroupBy 对象。 Resample 返回一个 Resampler 对象
-
对,所以,一种选择是也继承 DataFrameGroupBy,然后以某种方式告诉 pandas 在 MyDataFrame 实例上调用 groupby 时使用正确的构造函数?也许我可以在我的子类中覆盖 groupby,但是我需要对其他聚合方法(例如滚动、重新采样、扩展)执行相同的操作。看起来这个问题可能有一个正式的“预期”解决方案。
标签: python pandas dataframe subclassing