python pandas如何选择具有常见字符串值的行并查找sum,除以每个元素?

时间:2017-06-17 18:42:28

标签: python pandas dataframe

我有一个名为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

1 个答案:

答案 0 :(得分:2)

让我们使用groupbytransformsum

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