grg*_*rge 6 python subclassing dataframe pandas
注意:下面的线程提示了一个 pull request,它最终被合并到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
Run Code Online (Sandbox Code Playgroud)
我不知道这本身是否是一个“错误”,但我同意无论如何都应该对其进行更改。如果您查看一些groupby 类型对象的源代码,您会看到很多硬编码return DataFrame(...)
和return Series(...)
.
正如您正确指出的那样,Pandas 对象具有三种方法可用于构造自身的新版本:
_construct()
创建相同类型的对象_construct_sliced()
从类似数据框的对象创建类似系列的对象_construct_expanddim()
从类似系列的对象创建类似数据框的对象可以使用这些来代替 中的硬编码类型core/groupby/generic.py
,这很容易做到,因为 groupby 对象将起始存储NDFrame
为属性obj
。
可以在我的叉子上找到已实施这些更改的分支:https ://github.com/alkasm/pandas/tree/groupby-preserve-subclass
归档时间: |
|
查看次数: |
317 次 |
最近记录: |