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

时间:2016-03-05 15:39:26

标签: python pandas

我有不同样品的许多质谱。我试图规范每个样本的信号强度,以便我可以比较样本。

为此,我循环遍历每个文件,将数据整理到一个pandas数据框中,每个样本在一行上,列作为变量。因此,细胞保持与样品和变量相关的值。

虽然我正在填充数据框,但我尝试将列表(示例)与其自身的总和进行规范化 - 以便最终数据框中的每一行最多为1。

例如:

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

据我所知,它正确地填充了数据帧,但是当我对每一行求和时:

outputdata.T.sum()

我的大多数样本的值都小于1.0。总和低至0.747389,这表明它不仅仅是截断/浮动问题?

我尝试通过添加求和变量并通过循环打印来调试它。 即。

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

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

因此,将每行(每个样本)标准化为其值的总和。

1 个答案:

答案 0 :(得分:1)

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

除了我稍微修改了输入数据之外,我们每"Rel. Abundance","Formula"会有一些Sample#

以下是我的想法:

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)

输出:

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(由透视数据组成)