如何使用def函数变量函数遍历pandas df

时间:2019-01-11 11:05:34

标签: python pandas

我希望您能在这里指导我,因为我有些迷路,并且对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的简单方法。

谢谢!

2 个答案:

答案 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/24functools.partial一起使用。

鉴于函数调用的规律性,我会尝试以下方法:

map

更多信息,请点击https://docs.python.org/3.7/library/functools.html#functools.partial