熊猫:当列包含numpy数组时聚合

熊猫:当列包含numpy数组时聚合,第1张

熊猫:当列包含numpy数组聚合

一种可能更笨拙的方法是遍历

GroupBy
对象(它会生成
(grouping_value,df_subgroup)
元组。例如,要在此处实现所需的功能,可以执行以下 *** 作:

grouped = DF.groupby("category")aggregate = list((k, v["arraydata"].sum()) for k, v in grouped)new_df = pd.Dataframe(aggregate, columns=["category", "arraydata"]).set_index("category")

无论如何,这与大熊猫在幕后所做的非常相似[groupby,然后进行一些聚合,然后再合并],因此您并没有真正失去很多。


深入了解内部

这里的问题是,pandas正在明确检查输出是否 不是
an,

ndarray
因为它想要智能地重塑数组,如您在此片段中所看到的那样
_aggregate_named
,即发生错误的地方。

def _aggregate_named(self, func, *args, **kwargs):    result = {}    for name, group in self:        group.name = name        output = func(group, *args, **kwargs)        if isinstance(output, np.ndarray): raise Exception('Must produce aggregated value')        result[name] = self._try_cast(output, group)    return result

我的猜测是,发生这种情况是因为

groupby
已明确设置为尝试智能地将具有相同索引的Dataframe重新组合在一起,并且所有内容都很好地对齐了。由于这样的Dataframe中很少有嵌套数组,因此它会检查ndarray以确保您实际上正在使用聚合函数。在我的直觉中,这似乎是的工作
Panel
,但是我不确定如何完美地进行转换。顺便说一句,您可以通过将输出转换为列表来避免此问题,如下所示:

DF.groupby("category").agg({"arraydata": lambda x: list(x.sum())})

熊猫没有抱怨,因为现在您有了一个Python对象数组。[但这实际上只是在类型检查中作弊]。如果要转换回数组,只需对其应用

np.array
即可。

result = DF.groupby("category").agg({"arraydata": lambda x: list(x.sum())})result["arraydata"] = result["arraydata"].apply(np.array)

实际上,您要如何解决此问题取决于您 为什么
拥有的列

ndarray
以及是否要同时聚合其他任何内容。也就是说,您可以随时
GroupBy
像上面显示的那样进行迭代。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5668673.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存