我的问题可能有点令人困惑,所以让我解释一下。我有一个信息数据框,我想通过唯一的订单ID对其进行分组,这将产生以下列:
sum qty =每个订单ID执行的总金额。 csv =这是每个订单ID的csv列之和除以订单ID的执行量之和。
第一列很容易用groupby创建,它是我遇到问题的第二列。以下是我正在使用的示例数据:
qty sym price ordrefno ord_bidprice ord_askprice csv
0 -25000 TEST 0.044 984842 0.0435 0.044 12.5
1 100 TEST 0.0443 984702 0.0435 0.044 0.03
2 -10000 TEST 0.0405 983375 0.039 0.0405 15
3 -100 TEST 0.0443 984842 0.0435 0.044 0.03
这是我的代码:
cs1 = lambda x: np.sum(test.csv / test.qty)
f2 = {'qty' : ['sum'], 'csv' : {'es' : cs1}}
agg_td = trades.groupby('ordrefno').agg(f2)
答案 0 :(得分:0)
假设您想要总和的比率而不是比率的总和(问题措辞的方式表明这个但是代码中的函数会给出比率的总和,如果应用于df),我认为最简洁的方法是分两步。首先得到两列的总和,然后除以:
agg_td = trades.groupby('ordrefno')[['qty', 'csv']].sum()
agg_td.eval('es = csv/qty')
您还可以创建一个特殊函数并将其传递给groupby apply
方法:
es = trades.groupby('ordrefno').apply(lambda df: df.csv.sum() / df.qty.sum())
但这只会获得'es'
列。使用agg
的问题是函数的dict是特定于列的,在这里你需要组合两列。
答案 1 :(得分:0)
编写一个命名函数并使用apply
起作用:
def func(group):
sum_ = group.qty.sum()
es = (group.csv / group.qty).sum()
return pd.Series([sum_, es], index=['qty', 'es'])
trades.groupby('ordrefno').apply(func)
结果:
qty es
ordrefno
983375 -10000 -0.0015
984702 100 0.0003
984842 -25100 -0.0008