python - 如何使用 def 函数变量函数迭代 pandas df

标签 python pandas

我希望你能在这里指导我,因为我有点迷失并且在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.partialmap 一起使用。

鉴于您的函数调用的规律性,我会尝试以下操作:

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/

相关文章:

python - Django-Guardian - 限制组对类的访问

python - ' 'x_range' Bokeh Gmap 错误的值无效

python - Pandas 合并不保留排序顺序

python - 如何对滚动数据的子集应用滚动聚合函数?

python - Pandas 列中的精确匹配字符串

python - 使用来自其他带字符串的列的条件创建新列

python - 使用 Tweepy 避免速率限制从 API 获取最后的 Twitter 提及

python - smtplib 错误?第二次调用时 starttls/quit 失败

python - 如何将矩阵从 Matlab 转换为 Python?

python - Pandas:查找与组中谓词匹配的第一行的组索引(如果有)