如何使用pandas groupby函数根据groupby值应用公式

时间:2015-11-02 19:57:11

标签: python pandas dataframe

我的问题可能有点令人困惑,所以让我解释一下。我有一个信息数据框,我想通过唯一的订单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)

2 个答案:

答案 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