Python规范化失败的数字列表/ Pandas逐行规范化

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

Example Output

示例输出文件(未规范化)

因此,每行(每个样本)被归一化为其值的总和。


我假设你的CSV文件中第一个未命名的列是"Sample#",所以我还在输入的CSV文件中将其命名为Sample

除此之外,我稍微修改了输入数据,这样我们就可以得到一些"Rel. Abundance","Formula" / Sample#

这是我想出的:

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 - pvt转动输入数据

第二个DF - norm标准化DF(由透视数据组成)