通过 python 中的行组迭代函数

iterate a function through group of rows in python

我有一个包含四列的数据集:治疗 (hr)、时间 (t)、自变量 (y) 和 std.deviation (s_y)。治疗包括 2 组,A 和 B。

我已经定义了一个函数(模型),我想将它拟合到我的数据 (y) 中。我想将该功能应用于列处理下的组。我考虑过使用 'groupby' 根据治疗对 y 进行分组。但是,我的函数需要一个参数 K,它是根据索引定义的。例如,它必须对应于 y 列表中的第 3 个值。因为我想根据治疗进行分组,所以我应该为每个分组获得不同的 K。我无法将 reset.index() 选项应用于 groupby,所以我不知道如何告诉我的函数为每个子组获取 y 的第三个值。

是否有更有效的方法在治疗的不同组上循环函数?

这是代码:

this is my df: 

  treatment  time      y     std_y 
    A         1        2.29   0.30
    A         2        2.68   0.29
    A         3        2.79   0.29 
    B         1        2.25   0.07
    B         2        2.53   0.07 
    B         3        2.55   0.07  



for i, g in df.groupby('treatment'):
    def model (t, m, B, n):
        k = 0.2 
        return K*np.exp(-m*t) + B*np.exp(-n*t)
# k is the parameter that I would like to define based on index for each group in treatment.  
# It has to correspond to the 3rd element of y, and it should be a different value for group (A and B).

    fit = curve_fit(model, g['time'], g['y'],
                sigma=g['std_y'],
                p0=None)

    ans,cov = fit
    fit_m, fit_B, fit_n = ans

我不知道你的 curve_fit 是做什么的,但作为一个简单的例子,你正在寻找这样的东西:

import pandas as pd
import numpy as np

data = {'treatment': ['A', 'A', 'A', 'B', 'B', 'B'],
        'time': [1, 2, 3, 1, 2, 3],
        'y': [3, 4, 5, 6, 7, 8],
        'std_y': [1.1, 2.1, 3.1, 4.1, 5.1, 6.1]}

df = pd.DataFrame(data=data)

for i, g in df.groupby('treatment'):
    def model(t, m, b, n):
        return k*np.exp(-m*t) + b*np.exp(-n*t)

    k = g.iloc[2].y
    print('k:', k, 'model_out:', model(t=1, m=2, b=4, n=4))

    fit = curve_fit(model, g['time'], g['y'], sigma=g['std_y'], p0=None)
    ans, cov = fit
    fit_m, fit_B, fit_n = ans

注意:正如documentation所说,groupby函数不会改变观察的顺序,所以你需要考虑在使用它之前对你的数据集进行排序.