如何在数据框中迭代并获取每个组的输出?现在我只得到一行,并且无法识别一组
How can I iterate in dataframe and get output for each group? Now I get only one line and one group is not recognized
我需要根据多个索引('Treatment'、'individual'、'regime')遍历数据框中的每个数据集。我想使用 x 和 y 为每个治疗、个人和制度应用曲线拟合。目前我只能使用一个索引。
这是数据框
df_tot
Treatment y x individual regime
0 White 21.982733 800 Data20210608 Ctrl
1 White 21.973003 800 Data20210508 Ctrl
2 White 21.968242 800 Data20210408 Ctrl
3 White 21.982733 600 Data20210608 Ctrl
4 White 21.973003 600 Data20210508 Ctrl
5 White 21.968242 600 Data20210408 Ctrl
6 White 21.982733 500 Data20210608 Ctrl
7 White 21.973003 500 Data20210508 Ctrl
5 White 21.968242 500 Data20210408 Ctrl
15 White_FR 22.139293 800 Data20210608 Ctrl
16 White_FR 22.159840 800 Data20210508 Ctrl
17 White_FR 22.162254 800 Data20210408 Ctrl
18 White_FR 22.139293 600 Data20210608 Ctrl
19 White_FR 22.159840 600 Data20210508 Ctrl
20 White_FR 22.162254 600 Data20210408 Ctrl
21 White_FR 22.139293 500 Data20210608 Ctrl
22 White_FR 22.159840 500 Data20210508 Ctrl
23 White_FR 22.162254 500 Data20210408 Ctrl
2500 White 1.864671 800 Data20210708 T
2501 White 1.871709 800 Data20210608 T
2502 White 1.884706 800 Data20210508 T
2503 White 1.872854 600 Data20210708 T
2504 White 1.872233 600 Data20210608 T
2505 White 1.872344 600 Data20210508 T
2506 White 1.872854 500 Data20210708 T
2507 White 1.872233 500 Data20210608 T
2508 White 1.872344 500 Data20210508 T
2519 White_FR 1.882861 800 Data20210708 T
2520 White_FR 1.917002 800 Data20210608 T
2521 White_FR 1.903067 800 Data20210508 T
2519 White_FR 1.882861 600 Data20210708 T
2520 White_FR 1.917002 600 Data20210608 T
2521 White_FR 1.903067 600 Data20210508 T
2519 White_FR 1.882861 500 Data20210708 T
2520 White_FR 1.917002 500 Data20210608 T
2521 White_FR 1.903067 500 Data20210508 T
这是代码:
variables={'Spectrum':Spectrum, date':date, 'regime':regime,
'slope':float}
results = pd.DataFrame(variables, index=[])
group_df = df_tot.groupby(["Spectrum", "date", "regime", "PPFD",
"start"])
def model(x, slope):
return (slope*x) + start
group_df.apply(lambda x : curve_fit(model, x.loc[:, 'PPFD'],
x.loc[:, 'Photo']))
new_row = {'Spectrum': Spectrum, date':date, 'regime':regime, 'slope':
popt[0]} ## adding Spectrum gives an error
#name 'Spectrum' is not defined
results=results.append(new_row, ignore_index=True)
现在我明白了
results
date regime slope
0 Data20210608 Ctrl 0.05
您绝对可以遍历具有 1 个以上索引的数据框。
首先,您的代码存在一些重大问题:
- 为你的问题添加一些玩具数据,这样我们就可以用它来找到你所面临问题的解决方案(而不是你的数据输出)
- 永远不要使用
del
删除数据框中的某些列,使用 drop 或 select 除了一个使用 loc
或 iloc
.
- 不要写
all= [df_Ctrl, df_FR]
,all
在python中有特定的含义,你应该选择其他名称。
for g in all: #if I put for key, g in all
,all
这里是两个元素的列表,这里没有什么要解压的
- 您的数据框不是多索引的,如果需要,您必须修改它。
- 我强烈建议您不要使用
[[]]
到 select 数据帧的子数据帧,而是使用 loc or iloc。
如果我对您的问题的理解正确,您希望根据三个数据对数据框的元素进行分组:'Treatment'、'individual'、'regime',然后对于每个分组值,您想对 x 和 y 执行指定的操作。你可以适应这个:
group_df = df_tot.groupby(["Treatment", "individual", "regime"])
curved_df = group_df.apply(lambda x : curve_fit(model, x.loc[:, 'x'], x.loc[:, 'y']))
很明显,因为你没有提供模型,也没有curve_fit,我无法测试它是否正确。但主要思想就在这里,您可以从中着手。
我需要根据多个索引('Treatment'、'individual'、'regime')遍历数据框中的每个数据集。我想使用 x 和 y 为每个治疗、个人和制度应用曲线拟合。目前我只能使用一个索引。
这是数据框
df_tot
Treatment y x individual regime
0 White 21.982733 800 Data20210608 Ctrl
1 White 21.973003 800 Data20210508 Ctrl
2 White 21.968242 800 Data20210408 Ctrl
3 White 21.982733 600 Data20210608 Ctrl
4 White 21.973003 600 Data20210508 Ctrl
5 White 21.968242 600 Data20210408 Ctrl
6 White 21.982733 500 Data20210608 Ctrl
7 White 21.973003 500 Data20210508 Ctrl
5 White 21.968242 500 Data20210408 Ctrl
15 White_FR 22.139293 800 Data20210608 Ctrl
16 White_FR 22.159840 800 Data20210508 Ctrl
17 White_FR 22.162254 800 Data20210408 Ctrl
18 White_FR 22.139293 600 Data20210608 Ctrl
19 White_FR 22.159840 600 Data20210508 Ctrl
20 White_FR 22.162254 600 Data20210408 Ctrl
21 White_FR 22.139293 500 Data20210608 Ctrl
22 White_FR 22.159840 500 Data20210508 Ctrl
23 White_FR 22.162254 500 Data20210408 Ctrl
2500 White 1.864671 800 Data20210708 T
2501 White 1.871709 800 Data20210608 T
2502 White 1.884706 800 Data20210508 T
2503 White 1.872854 600 Data20210708 T
2504 White 1.872233 600 Data20210608 T
2505 White 1.872344 600 Data20210508 T
2506 White 1.872854 500 Data20210708 T
2507 White 1.872233 500 Data20210608 T
2508 White 1.872344 500 Data20210508 T
2519 White_FR 1.882861 800 Data20210708 T
2520 White_FR 1.917002 800 Data20210608 T
2521 White_FR 1.903067 800 Data20210508 T
2519 White_FR 1.882861 600 Data20210708 T
2520 White_FR 1.917002 600 Data20210608 T
2521 White_FR 1.903067 600 Data20210508 T
2519 White_FR 1.882861 500 Data20210708 T
2520 White_FR 1.917002 500 Data20210608 T
2521 White_FR 1.903067 500 Data20210508 T
这是代码:
variables={'Spectrum':Spectrum, date':date, 'regime':regime,
'slope':float}
results = pd.DataFrame(variables, index=[])
group_df = df_tot.groupby(["Spectrum", "date", "regime", "PPFD",
"start"])
def model(x, slope):
return (slope*x) + start
group_df.apply(lambda x : curve_fit(model, x.loc[:, 'PPFD'],
x.loc[:, 'Photo']))
new_row = {'Spectrum': Spectrum, date':date, 'regime':regime, 'slope':
popt[0]} ## adding Spectrum gives an error
#name 'Spectrum' is not defined
results=results.append(new_row, ignore_index=True)
现在我明白了
results
date regime slope
0 Data20210608 Ctrl 0.05
您绝对可以遍历具有 1 个以上索引的数据框。
首先,您的代码存在一些重大问题:
- 为你的问题添加一些玩具数据,这样我们就可以用它来找到你所面临问题的解决方案(而不是你的数据输出)
- 永远不要使用
del
删除数据框中的某些列,使用 drop 或 select 除了一个使用loc
或iloc
. - 不要写
all= [df_Ctrl, df_FR]
,all
在python中有特定的含义,你应该选择其他名称。 for g in all: #if I put for key, g in all
,all
这里是两个元素的列表,这里没有什么要解压的- 您的数据框不是多索引的,如果需要,您必须修改它。
- 我强烈建议您不要使用
[[]]
到 select 数据帧的子数据帧,而是使用 loc or iloc。
如果我对您的问题的理解正确,您希望根据三个数据对数据框的元素进行分组:'Treatment'、'individual'、'regime',然后对于每个分组值,您想对 x 和 y 执行指定的操作。你可以适应这个:
group_df = df_tot.groupby(["Treatment", "individual", "regime"])
curved_df = group_df.apply(lambda x : curve_fit(model, x.loc[:, 'x'], x.loc[:, 'y']))
很明显,因为你没有提供模型,也没有curve_fit,我无法测试它是否正确。但主要思想就在这里,您可以从中着手。