【问题标题】:iterate a function through group of rows in python通过python中的一组行迭代一个函数
【发布时间】:2020-08-02 20:24:41
【问题描述】:

我有一个包含四列的数据集:处理 (hr)、时间 (t)、自变量 (y) 和标准偏差 (s_y)。治疗包括2组,A和B。

我已经定义了一个函数(模型),我想将它拟合到我的数据(y)中。我想将该功能应用于列处理下的组。我考虑过使用“groupby”根据治疗对 y 进行分组。但是,我的函数需要一个参数,K,它是基于 index 定义的。例如,它必须对应于 y 列表中的第三个值。由于我想根据治疗创建子组,我应该为每个子组获得不同的 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

【问题讨论】:

  • 第 3 个元素用于示例(表示组中的最后一行)或k 始终是第 3 个元素,无论组的形状如何?
  • K 将始终是第三个元素,无论组的形状如何。谢谢

标签: loops indexing pandas-groupby rows


【解决方案1】:

我不知道你的 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 函数不会改变观察的顺序,因此您需要在使用之前考虑对数据集进行排序。

【讨论】:

  • 感谢您的回复!非常有帮助,但我仍然有点困惑。函数曲线拟合计算出适合模型的最佳参数(基于我的数据)。它们应该是三个参数:m,n 和 B。我需要计算这些参数,因为我稍后会使用它们。我不确定如何根据您的脚本计算它们。您如何建议在 fun 中调用 curve_fit 函数?我试过这样:
  • 我基本上在您的代码中添加了以下内容,它将最后两行 fun 替换为: fit = curve_fit(fun, df['time'], df['y'], sigma = df ['std_y], p0 = None) / ans, cov = fit / fit_m, fit_B, fit_n = ans/ return ans/
  • 我更改了代码,为您提供更接近您当前代码的解决方案,希望对您有所帮助!
  • 嗨@Martina Lazzarin,如果这个或任何答案解决了您的问题,请点击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 2021-12-01
  • 2021-04-27
相关资源
最近更新 更多