我希望你能在这里指导我,因为我有点迷失并且在Python编程方面没有真正的经验。
我的目标:我必须计算给定“化合物”的“加合物”,两者都代表数字,但对于每个“化合物”有 46 种不同的“加合物”。
每个加合物的计算如下:
加合物 1 = [精确质量*M/电荷 + 加合物质量]
其中,精确质量 = 数字,M 和电荷 = 根据每种加合物类型的数字(1、2、3 等),加合物质量 = 根据每种加合物的数字(正或负)。
我的数据:2个数据框。其中包含加合物名称、M、电荷、加合物质量。 另一个对应于我想要迭代的化合物的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"]
然后我为每个 ionic 定义了一个函数,使用索引来设置每个值
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]
依此类推,直到func 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。
我认为这可能是一种更简单的定义函数的方法,并且它根据每个 ionic 而变化(也许是 forloop?),也是一种更简单的方法来应用函数并获取相应的名称,而无需每个 .loc 。
谢谢!
最佳答案
一种方法是将 functools.partial
与 map
一起使用。
鉴于您的函数调用的规律性,我会尝试以下操作:
from funtools import partial
def func(x, n):
return x*df_M[n]/df_div[n] + df_mass[n]
for i in range(max_i): #change max_i with the integer you need
df[df_name.loc[i]] = map(partial(func, n=i), df["exact_mass"])
#df[df_name.loc[i]] = df["exact_mass"].map(partial(func, n=i)) should work as well
更多信息请点击 https://docs.python.org/3.7/library/functools.html#functools.partial
关于python - 如何使用 def 函数变量函数迭代 pandas df,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54145284/