итерация функции по группе строк в python - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть набор данных с четырьмя столбцами: обработка (час), время (t), независимая переменная (y) и std.deviation (s_y). Лечение включает в себя 2 группы: A и B.

Я определил функцию (модель) и хочу подогнать ее под свои данные (y). Я хочу применить эту функцию к группам в колонке лечения. Я думал об использовании 'groupby' для группировки y на основе лечения. Однако моей функции необходим параметр K, который определяется на основе индекса. Например, оно должно соответствовать 3-му значению в списке y. Поскольку я хочу создавать подгруппы на основе лечения, я должен получить разные K для каждой подгруппы. Я не могу применить параметр reset.index () к groupby, поэтому я не знаю, как я могу сказать своей функции получить 3-е значение y для каждой подгруппы.

Есть ли более эффективный способ l oop функции в разных группах лечения?

Это код:

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

1 Ответ

0 голосов
/ 20 апреля 2020

Я не знаю точно, что делает ваш 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

ПРИМЕЧАНИЕ : как Документация гласит, что функция groupby не меняет порядок наблюдений, поэтому вам следует рассмотреть возможность сортировки набора данных перед его использованием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...