通过 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函数不会改变观察的顺序,所以你需要考虑在使用它之前对你的数据集进行排序.
我有一个包含四列的数据集:治疗 (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函数不会改变观察的顺序,所以你需要考虑在使用它之前对你的数据集进行排序.