首页 > 解决方案 > 从以有序字典为行的系列创建熊猫数据框

问题描述

我正在尝试将lmfit参数结果提取为数据框。我通过 a和参数传递 1 列x、1 列,并将函数的输出作为 OrderedDict 传递给输出。datafit_funcparsminimizelmfit

out = minimize(fit_func, pars, method = 'leastsq', args=(x, data))
res = out.params.valuesdict()
res

输出:

OrderedDict([('a1', 12.850309404600393),
             ('c1', 1346.833513206811),
             ('s1', 44.22337472274829),
             ('f1', 1.1275639898142586),
             ('a2', 77.15732669480884),
             ('c2', 1580.5712512351947),
             ('s2', 16.239969775527275),
             ('f2', 0.8684363668111492)])

我在 DataFrames 中想要的输出是这样实现的pd.DataFrame(res,index=[0])想要的_out

我有 3 个数据列,我想快速适应:

x = d.iloc[:,0]
fit_odict = pd.DataFrame(d.iloc[:,1:4].\
                         apply(lambda y: minimize(fit_func, pars, method = 'leastsq', args=(x, y))\
                        .params.valuesdict()),index=[1])

但是我得到了一系列有序字典作为数据框中的行:

out_2

如何将三个参数结果作为行获得我想要的输出?有没有更好的方法来应用该功能?

更新:

在我的解决方案中附加了@M Newville。对于那些想要lmfit从多个数据列中快速提取参数结果的人可能会有所帮助d1.iloc[:,1:]

def fff(cols):
    out = minimize(fit_func, pars, method = 'leastsq', args=(x, cols))
    return {key: par.value for key, par in out.params.items()}

results = d1.iloc[:,1:].apply(fff,result_type='expand').transpose()

输出:

解决方案

标签: pandasdataframeseriesordereddictionarylmfit

解决方案


对于单一合身,这可能是您正在寻找的:

out = minimize(fit_func, pars, method = 'leastsq', args=(x, data))
fit_odict = pd.DataFrame({key: [par.value] for key, par in out.params.items()})

我想你可能正在寻找这样的东西:

results = {key: [] for key in pars}
for data in datasets:
    out = minimize(fit_func, pars, method='leastsq', args=(x, data))
    for par_name, val_list in results.items():
        val_list.append(out.params[par_name].value)
results = pd.DataFrame(results)

您可能可以将所有内容都放入一条长线中,但我不推荐它——有人可能想阅读该代码;)。


推荐阅读