gpt4 book ai didi

python - 子类 DataFrame 的 Pandas groupby、resample 等

转载 作者:太空宇宙 更新时间:2023-11-03 10:47:54 25 4
gpt4 key购买 nike

注意:下面的线程提示了一个拉取请求,该请求最终合并到 v1.10 中.此问题现已解决。

我正在使用一个子类化的 DataFrame,这样我就可以更方便地访问一些特定于我的用例的转换方法和元数据。大多数 DataFrame 操作都按预期工作,因为它们返回子类的实例,而不是 pandas.DataFrame 的实例。但是,像 DataFrame.groupbyDataFrame.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

最佳答案

我不知道它本身是否是一个“错误”,但我同意无论如何都应该对其进行更改。如果你看一下 source code 中的一些内容对于 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

关于python - 子类 DataFrame 的 Pandas groupby、resample 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57796464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com