栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

熊猫:当列包含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
像上面显示的那样进行迭代。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/662562.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号