我有一个名为Results3的数据框,如下所示:
Tag Exp. m/z Intensity a
file1.xls 1000 10000 True
file1.xls 1100 20000 True
file1.xls 1200 30000 True
file2.xls 2000 11000 True
file2.xls 2100 12000 True
file2.xls 2200 13000 True
file2.xls 2300 14000 True
file3.xls 3000 31000 True
file3.xls 3100 123 True
其中Tag = str和Exp。 m / z&强度是float64。
我的目标是创建另一个名为norm_intensity的列,其中Intensity中的每个元素除以每个标记的强度值之和,以便对强度值进行标准化。例如,对于上表Exp。 m / z 1000 of file1.xls,norm_intensity为:10000 /(10000 + 20000 + 30000)。 file2.xls中的那些将除以来自file2.xls组的强度值之和。
我试过通过以下方式找到总和:
groups_sum = results3.groupby(results3['Tag'])
Intensity_sum = groups_sum.agg({'Intensity':sum})
但是我似乎无法弄清楚如何离开这里。最后,我将通过以下方式对结果3进行分类:
bins = np.arange(900, 3000, 1)
groups = results3.groupby([np.digitize(results3['Exp. m/z'], bins), 'Tag'])
我希望在进行分箱之前以这种格式获得结果3:
Tag Exp. m/z Intensity Norm_Intensity
file1.xls 1000 10000 0.1666
file1.xls 1100 20000 0.3333
file1.xls 1200 30000 0.5
file2.xls 2000 11000 0.22
file2.xls 2100 12000 0.24
file2.xls 2200 13000 0.26
file2.xls 2300 14000 0.28
file3.xls 3000 31000 0.9960
file3.xls 3100 123 0.00395
答案 0 :(得分:2)
让我们使用groupby
,transform
和sum
:
Result3.assign(Norm_Intensity=Result3.groupby('Tag')['Intensity'].transform(lambda x: x/x.sum()))
输出:
Tag Exp. m/z Intensity a Norm_Intensity
0 file1.xls 1000 10000 True 0.166667
1 file1.xls 1100 20000 True 0.333333
2 file1.xls 1200 30000 True 0.500000
3 file2.xls 2000 11000 True 0.220000
4 file2.xls 2100 12000 True 0.240000
5 file2.xls 2200 13000 True 0.260000
6 file2.xls 2300 14000 True 0.280000
7 file3.xls 3000 31000 True 0.996048
8 file3.xls 3100 123 True 0.003952