首页 > 解决方案 > 计算每组多索引对象 pandas

问题描述

我想为 groupby 对象的每组计算一个值,但对组的每一行重复它。 尽管标题似乎是我需要的,但在 Pandas 数据框组中的计算不起作用。我看不出公式是否有问题。它应该是excel词汇表中的一种sumproduct。

dat = pd.DataFrame({'Supplier': ['A', 'A', 'A', 'B','B'], 'Id': ['1','2','3','4','5'], 'a': [2,2,2,2,2], 'AVG' :[5,6,7,8,3], 'BP': [3,4,5,6,3], 'Hc': [0.15,0.15,0.15,0.15,0.15]})

dat = dat.groupby(['Supplier', 'Id'])['a','AVG', 'BP','Hc'].sum()



for supplier in dat.index[0]:
    dat['s'] = np.sqrt((2 * (dat['a'])/ (
        ((dat['AVG'] * dat['BP'] * (dat['Hc']/4)).sum()))))

我得到的结果是这样的:

             a  AVG  BP    Hc         s
Supplier Id                            
A        1   2    5   3  0.15  0.902358
         2   2    6   4  0.15  0.902358
         3   2    7   5  0.15  0.902358
B        4   2    8   6  0.15  0.902358
         5   2    3   3  0.15  0.902358

但我想得到类似的东西:

             a  AVG  BP    Hc         s
Supplier Id                            
A        1   2    5   3  0.15  x
         2   2    6   4  0.15  x
         3   2    7   5  0.15  x
B        4   2    8   6  0.15  y
         5   2    3   3  0.15  y

这里的 x 和 y 只是为了表明每个“组”的数字应该不同

标签: pythonpandas

解决方案


你可以试试这个:

groupby.apply功能使您可以访问每个组(供应商)数据框。

def cal_func(df):
    df['s'] = np.sqrt((2 * (df['a'])/ (
        ((df['AVG'] * df['BP'] * (df['Hc']/4)).sum()))))
    return df

dat_new = dat.groupby(['Supplier']).apply(cal_func)
dat_new

  Supplier Id  a  AVG  BP    Hc         s
0        A  1  2    5   3  0.15  1.200600
1        A  2  2    6   4  0.15  1.200600
2        A  3  2    7   5  0.15  1.200600
3        B  4  2    8   6  0.15  1.367971
4        B  5  2    3   3  0.15  1.367971

推荐阅读