假设我有一个像这样的数据框:
n = 20
dim1 = np.random.randint(1, 3, size=n)
dim2 = np.random.randint(3, 5, size=n)
data1 = np.random.randint(10, 20, size=n)
data2 = np.random.randint(1, 10, size=n)
df = pd.DataFrame({'a': dim1, 'b': dim2 ,'val1': data1, 'val2': data2})
如果我定义了一个按组返回的函数:
def h(x):
if x['val2'].sum() == 0:
return 0
else:
return (x['val1'].sum())*1.0/x['val2'].sum()*1.0
按列之一进行分组并汇总将返回结果:
df.groupby(['a']).aggregate(h)['val1']
尽管它将所有现有列转换为所需结果,而不是添加新列
使用聚合时,按两列分组会导致错误:
df.groupby(['a','b']).aggregate(h)['val1']
KeyError: 'val2'
但是,将聚合切换为apply似乎可行。
我有两个问题:
提前致谢。
要稍微退一步,执行此特定“聚合”的一种更快的方法是多次使用sum(在cython中进行了优化)。
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分组代码很长毛,通常通过创建一个列表来查看正在发生的值,从而“偷偷摸摸地”窥视正在发生的事情:
def h1(x):
a.append(x)
return h(x)
a = []
警告:有时此列表中的数据类型不一致(在此情况下,pandas在进行任何计算之前会尝试一些不同的事情)...如本例所示!
第二个聚合卡在每个列上,因此该组(将引发错误)被卡住:
0 10
4 16
8 13
9 17
17 17
19 11
Name: val1, dtype: int64
这是val1列的子系列,其中(a,b)=(1,3)。
这很可能是一个错误,在引发此问题之后它可能还会尝试其他方法(我怀疑这就是为什么firsts版本有效的原因,特别是这样)。
对于那些感兴趣的人,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是关于什么的...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句