我希望您能在这里指导我,因为我有些迷路,并且对python编程没有真正的经验。
我的目标:我必须为给定的“化合物”计算“加合物”,两者均表示麻木,但是对于“化合物”来说,有46种不同的“加合物”。
每个加合物的计算如下:
加合物1 = [精确质量* M /电荷+加合物质量]
其中exact_mass =数字,M和电荷=根据每种加合物类型的数量(1、2、3等),Adduct_mass =根据每种加合物的数量(正或负)。
我的数据:2个数据帧。一种带有加合物的名称,M,Charge,Adduct_mass。 另一个对应于我要迭代的化合物的Compound_name和Exact_mass(我只是放了一个小的数据集)
加成:df_al
import pandas as pd
data = [["M+3H", 3, 1, 1.007276], ["M+3Na", 3, 1, 22.989], ["M+H", 1, 1, 1.007276], ["2M+H", 1, 2, 1.007276], ["M-3H", 3, 1, -1.007276]]
df_al = pd.DataFrame(data, columns=["Ion_name", "Charge", "M", "Adduct_mass"])
化合物:df
import pandas as pd
data1 = [[1, "C3H64O7", 596.465179], [2, "C30H42O7", 514.293038], [4, "C44H56O8", 712.397498], [4, "C24H32O6S", 448.191949], [5, "C20H28O3", 316.203834]]
df = pd.DataFrame(data1, columns=["CdId", "Formula", "exact_mass"])
我的代码:
df_name = df_al["Ion_name"]
df_mass = df_al["adduct_mass"]
df_div = df_al["Div"]
df_M = df_al["M"]
然后我为每个离子定义一个使用索引设置每个值的函数
def A0(x):
return x*df_M[0]/df_div[0] + df_mass[0]
def A1(x):
return x*df_M[1]/df_div[1] + df_mass[1]
def A2(x):
return x*df_M[2]/df_div[2] + df_mass[2]
def A3(x):
return x*df_M[3]/df_div[3] + df_mass[3]
def A4(x):
return x*df_M[4]/df_div[4] + df_mass[4]
def A5(x):
return x*df_M[5]/df_div[5] + df_mass[5]
def A6(x):
return x*df_M[6]/df_div[6] + df_mass[6]
依此类推,直到功能A46
然后我将每个函数映射到每个化合物,然后将每个值存储在df的新列中(这是我的另一个问题:如何在与该键匹配的每个列的顶部添加每个离子的名称相应的功能?)
df[df_name.loc[0]] = df["exact_mass"].map(A0)
df[df_name.loc[1]] = df["exact_mass"].map(A1)
df[df_name.loc[2]] = df["exact_mass"].map(A2)
df[df_name.loc[3]] = df["exact_mass"].map(A3)
df[df_name.loc[4]] = df["exact_mass"].map(A4)
df[df_name.loc[5]] = df["exact_mass"].map(A5)
df[df_name.loc[6]] = df["exact_mass"].map(A6)
。 。 。 以此类推,直到应用A46。
我想这是定义函数的简单方法,它会根据每个离子而变化(也许是forloop?),而且是应用函数并获得相应名称而不用.loc的简单方法。
谢谢!
答案 0 :(得分:0)
这是一个命题定义
def A(x,i):
return x*df_M[i]/df_div[i] + df_mass[i]
然后执行A(x,5)与A5(x)相同。然后遍历所有内容:
for i in range(47):
df[df_name.loc[i]] = df['exact_mass'].map(lambda x: A(x,i))
我认为可能有一种更优雅的方法来做到这一点,但这应该可行。
答案 1 :(得分:0)
一种方法是将54.142.11.0/24
与functools.partial
一起使用。
鉴于函数调用的规律性,我会尝试以下方法:
map
更多信息,请点击https://docs.python.org/3.7/library/functools.html#functools.partial