我有不同样品的许多质谱。我试图规范每个样本的信号强度,以便我可以比较样本。
为此,我循环遍历每个文件,将数据整理到一个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?
编辑: 输入数据示例:
示例输出文件(未规范化)
因此,将每行(每个样本)标准化为其值的总和。
答案 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(由透视数据组成)