一种可能更笨拙的方法是遍历
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像上面显示的那样进行迭代。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)