稍微退后一步,执行此特定“聚合”的更快方法是仅使用sum(在 cython 中进行了优化) http://pandas.pydata.org/pandas-docs/stable/groupby.html#cython-optimized-aggregation-functions一些时间。
In [11]: %timeit g.apply(h)
1000 loops, best of 3: 1.79 ms per loop
In [12]: %timeit g['val1'].sum() / g['val2'].sum()
1000 loops, best of 3: 600 µs per loop
IMO groupby 代码非常复杂,通常通过创建所看到的值的列表来懒惰地“黑匣子”查看正在发生的事情:
def h1(x):
a.append(x)
return h(x)
a = []
警告:有时此列表中的数据类型不一致(其中pandas 尝试了一些不同的事情在进行任何计算之前)...如本例所示!
第二个聚合被卡住了each列,因此该组(会引发错误):
0 10
4 16
8 13
9 17
17 17
19 11
Name: val1, dtype: int64
这是 val1 列的子系列,其中 (a, b) = (1, 3)。
这很可能是一个错误,在引发这个错误之后,也许它可以尝试其他方法(我怀疑这就是第一个版本起作用的原因,它是特殊情况)......
对于那些有兴趣的人a
我得到的是:
In [21]: a
Out[21]:
[SNDArray([125755456, 131767536, 13, 17, 17, 11]),
Series([], name: val1, dtype: int64),
0 10
4 16
8 13
9 17
17 17
19 11
Name: val1, dtype: int64]
我不知道 SNDArray 是怎么回事......