假设我有一个如下的数据框:
如果我定义一个返回分组的函数:
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'
但是将aggregate更改为apply似乎起作用了。
我有两个问题:
- 为什么apply能够工作而aggregate不行?
- 如果在按一些键分组一个数据框之后,我想使用一个函数将组值聚合为一个新列,最好的方法是什么?
提前感谢。