索引为groupby的列的熊猫产品

时间:2018-09-11 10:22:48

标签: python pandas pandas-groupby

我正在使用一个数据框,并且必须进行分组,以便对我的数据进行一些操作。

这是我的数据框的一个示例:

 I  SI   deltas

 1  10   0.1
 1  14   0.1
 2  10   0.1
 2  18   0.3
 1  17   0.05
 2  30   0.3
 1  10   0.4
 1  14   0.2
 2  10   0.1
 2  18   0.2
 1  17   0.15

现在,对于每个I,我都以这种方式计算SI的相对频率:

results = df.groupby(['I', 'SI'])[['deltas']].sum()
#for each I, we sum all the weights (Deltas)
denom = results.groupby('I')['deltas'].sum()
#for each I, we divide each  deltas by the sum, getting them normalized to one
results.deltas = results.deltas / denom

所以我的数据框现在看起来像这样:

我= 1

             deltas 

  SI = 10     0.5
  SI = 14     0.3
  SI = 17     0.2

I = 2

             deltas 

  SI = 10     0.2
  SI = 18     0.5
  SI = 30     0.3

....

我需要做的是为每个我打印增量乘以其相对SI的增量:

     I = 1       sum =    0.5 * 10 + 0.3*14 + 0.2*17 = 12.6 
     I = 2       sum =    0.2*10 + 18*0.5 + 30*0.3 = 21

但是从现在开始,我正在使用索引为I和SI的数据框,所以我不知道如何使用它们。我尝试了这段代码:

     for idx2, j in enumerate(results.index.get_level_values(0).unique()):
        #print results.loc[j]
        f.write("%d\t"%(j)+results.loc[j].to_string(index=False)+'\n')

但是我不确定如何继续获取索引值

1 个答案:

答案 0 :(得分:1)

让我们假设您在初始转换后拥有一个输入数据框df。如果SI是您的索引,则首先通过df = df.reset_index()将其提升为一列。

   I  SI  weight
0  1  10     0.5
1  1  14     0.3
2  1  17     0.2
3  2  10     0.2
4  2  18     0.5
5  2  30     0.3

然后可以计算SIweight的乘积,然后使用GroupBy + sum

res = df.assign(prod=df['SI']*df['weight'])\
        .groupby('I')['prod'].sum().reset_index()

print(res)

   I  prod
0  1  12.6
1  2  20.0

对于单独的单个数据帧,可以将np.dot用作点积。

s = pd.Series([0.5, 0.3, 0.2], index=[10, 14, 17])
s.index.name = 'SI'

res = np.dot(s.index, s)  # 12.6