Python Normalising a list of numbers failing/Pandas normalise row by row
我有不同样品的许多质谱。我试图规范每个样本的信号强度,以便我可以比较样本。
为此,我循环遍历每个文件,将数据整理到一个pandas数据框中,每个样本在一行上,列作为变量。因此,细胞保持与样品和变量相关的值。
在我填充数据帧的同时,我尝试将列表(样本)与其自身的总和进行规范化 - 以便最终数据帧中的每一行最多为1。
例如:
1 2 3 4 5 6 7 8 9 10 | for y in files: df2 = pd.read_csv(inputloc+y,index_col=0) totalRA = df2["Rel. Abundance"] totalRAlist = totalRA.tolist() totalRAsum = sum(totalRAlist) for i in range(len(df2)): form = df2.loc[i]["Formula"] RA = df2.loc[i]["Rel. Abundance"] RAnorm = float(abs(RA)/totalRAsum) outputdata.loc[y[:-9]][form] = RAnorm |
据我所知,它正确地填充了数据帧,但是当我对每一行求和时:
1 | outputdata.T.sum() |
对于大多数样本,我得到的值小于1.0。总和低至0.747389,这表明它不仅仅是截断/浮动问题?
我尝试通过添加求和变量并通过循环打印来调试它。
即
1 2 3 4 5 6 7 | a = 0 for i in range(len(df2)): form = df2.loc[i]["Formula"] RA = df2.loc[i]["Rel. Abundance"] RAnorm = float(abs(RA)/totalRAsum) a = a + RAnorm print a |
对于每个样本,这总是总计为1。
因此,我不知道我哪里出错了。
或者,是否有一种简单的方法来规范化Pandas Dataframe的每一行,以便每行总和为1?
编辑:
输入数据示例:
http://dumptext.com/8ky1RX8F
示例输出文件(未规范化)
因此,每行(每个样本)被归一化为其值的总和。
我假设你的CSV文件中第一个未命名的列是
除此之外,我稍微修改了输入数据,这样我们就可以得到一些
这是我想出的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | from __future__ import print_function import pandas as pd df = pd.read_csv('data.csv', sep=',', usecols=['Sample', 'Rel. Abundance', 'Formula']) # pivot input data pvt = df.pivot(index='Sample', columns='Formula', values='Rel. Abundance').fillna(0).reset_index().set_index('Sample') print(pvt) # normalize data norm = pvt.div(pvt.sum(axis=1), axis=0) # check sum of rows norm['sum'] = norm.sum(axis=1) # output print(norm) |
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | Formula C10H16O2 C10H16O3 C10H18O2 C10H18O3 C10H20O2 C11H20O2 \ Sample 0 0 0 0 0 0 0 1 5300142 0 0 0 0 0 2 0 0 22442914 0 0 0 3 0 0 0 0 8355451392 0 4 0 4886962 0 0 0 16859592 5 0 0 0 16221800 0 0 Formula C8H14O4 C9H10O4 C9H14O4 C9H18O2 C9H18O3 Sample 0 0 5157540 0 70453296 0 1 5217051 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 11975477 4 0 0 0 0 0 5 0 0 6799955 0 0 Formula C10H16O2 C10H16O3 C10H18O2 C10H18O3 C10H20O2 C11H20O2 C8H14O4 \ Sample 0 0.00000 0.000000 0 0.000000 0.000000 0.000000 0.00000 1 0.50395 0.000000 0 0.000000 0.000000 0.000000 0.49605 2 0.00000 0.000000 1 0.000000 0.000000 0.000000 0.00000 3 0.00000 0.000000 0 0.000000 0.998569 0.000000 0.00000 4 0.00000 0.224724 0 0.000000 0.000000 0.775276 0.00000 5 0.00000 0.000000 0 0.704629 0.000000 0.000000 0.00000 Formula C9H10O4 C9H14O4 C9H18O2 C9H18O3 sum Sample 0 0.068212 0.000000 0.931788 0.000000 1 1 0.000000 0.000000 0.000000 0.000000 1 2 0.000000 0.000000 0.000000 0.000000 1 3 0.000000 0.000000 0.000000 0.001431 1 4 0.000000 0.000000 0.000000 0.000000 1 5 0.000000 0.295371 0.000000 0.000000 1 |
输出说明:
第一个DF -
第二个DF -