考虑 pd.Series s

a = np.arange(4)
mux = pd.MultiIndex.from_product([list('ab'), list('xy')])
s = pd.Series([a] * 4, mux)
print(s)

a  x    [0, 1, 2, 3]
   y    [0, 1, 2, 3]
b  x    [0, 1, 2, 3]
   y    [0, 1, 2, 3]
dtype: object

问题 s 的每个元素都是一个 numpy.array 。当我尝试在组内求和时,出现错误,因为 groupby 函数期望结果为标量......(我猜)
s.groupby(level=0).sum()



解决 问题
当我将 applynp.sum 一起使用时,它工作正常。
s.groupby(level=0).apply(np.sum)

a    [0, 2, 4, 6]
b    [0, 2, 4, 6]
dtype: object

问题
有没有一种优雅的方法来处理这个问题?

真正的问题
我实际上想以这种方式使用 agg
s.groupby(level=0).agg(['sum', 'prod'])

但它以同样的方式失败。
得到这个的唯一方法是
pd.concat([g.apply(np.sum), g.apply(np.prod)],
          axis=1, keys=['sum', 'prod'])

python - 必须产生聚合值。我发誓我是-LMLPHP

但这不能很好地推广到更长的转换列表。

最佳答案

from this well explained answer 您可以将 ndarray 转换为列表,因为 Pandas 似乎正在检查输出是否为 ndarray,这就是为什么会出现此错误的原因:

s.groupby(level=0).agg({"sum": lambda x: list(x.sum()), "prod":lambda x: list(x.prod())})

出[249]:
            sum          prod
a  [0, 2, 4, 6]  [0, 1, 4, 9]
b  [0, 2, 4, 6]  [0, 1, 4, 9]

关于python - 必须产生聚合值。我发誓我是,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39840546/

10-12 18:13