Python中如何将DataFrame输入行与fsolve求解结果合并为10列数据集?
问题:合并DataFrame输入行与计算结果为10列数据集
现有如下输入DataFrame:
import pandas as pd import numpy as np from scipy.optimize import fsolve df = pd.read_csv('path/testfile.csv', delimiter='\t', header=None) print(df)
输出的DataFrame内容:
0 1 2 3 4 5 0 0.227996 0.337029 0.238164 0.183009 0.085747 0.134129 1 0.247891 0.335556 0.272129 0.187329 0.085921 0.128372 2 0.264761 0.337778 0.245918 0.183212 0.080493 0.122786 3 0.305061 0.337778 0.204265 0.208453 0.071558 0.083683 4 0.222749 0.337029 0.209715 0.084253 0.142014 0.234673 5 0.190816 0.337029 0.291872 0.041575 0.463764 0.053193 6 0.299625 0.337029 0.206064 0.200905 0.072955 0.092528 7 0.259740 0.340045 0.202792 0.156021 0.087506 0.148796
通过以下代码基于该DataFrame计算结果:
def f2_bis(z, Ai, Bi, Ci, Di, Ei, Fi, Hi): a, b, c, d = z return np.array([ Ai*a*((1-c)*Bi+(b-d)*Ci)-Di, Ei+a*c*d*b, Fi+Hi*c*a*d+b, Hi+Fi+Ei*a*b*c*d ]) # 拆分各列到变量 A, B, C ,D, E, F = df.to_numpy().T H = 1-A # 逐行计算结果 res = [ fsolve(f2_bis, [1,1,1,1], args=(Ai, Bi, Ci, Di, Ei, Fi, Hi)) for Ai, Bi, Ci, Di, Ei, Fi, Hi in zip(A, B, C, D, E, F, H) ]
当前res的输出为:
[array([ 1.25482583, -0.32608114, -0.17861197, -0.98296457]), array([ 0.70750447, -0.41512857, -0.30218114, -1.80533338]), array([-2.91283478, -0.41076736, 1.41022472, -0.09615889]), array([ 2.87736785, 0.25256582, 0.6107988 , -0.26507222]), array([-0.532438 , 0.34016552, 6.64918304, 0.18908195]), array([ 1.1062844 , 0.73110855, -0.65958519, 1.32070547]), array([1., 1., 1., 1.]), array([1., 1., 1., 1.])]
需求:将每行的6列输入数据与对应的4列计算结果合并,得到每行含10列的数据集,期望输出格式如下:
[array([ 0.227996, 0.337029, 0.238164,0.183009, 0.085747, 0.134129, 1.25482583, -0.32608114, -0.17861197, -0.98296457]), array([ 0.247891, 0.335556, 0.272129, 0.187329, 0.085921, 0.128372, 0.70750447, -0.41512857, -0.30218114, -1.80533338]), array([0.264761, 0.337778, 0.245918, 0.183212, 0.080493, 0.122786, -2.91283478, -0.41076736, 1.41022472, -0.09615889]), array([0.305061, 0.337778, 0.204265, 0.208453, 0.071558, 0.083683, 2.87736785, 0.25256582, 0.6107988 , -0.26507222]), array([0.222749, 0.337029, 0.209715, 0.084253, 0.142014, 0.234673, -0.532438 , 0.34016552, 6.64918304, 0.18908195]), array([0.190816, 0.337029, 0.291872, 0.041575, 0.463764, 0.053193, 1.1062844 , 0.73110855, -0.65958519, 1.32070547]), array([0.299625, 0.337029, 0.206064, 0.200905, 0.072955, 0.092528, 1., 1., 1., 1.]), array([0.259740, 0.340045, 0.202792, 0.156021, 0.087506, 0.148796, 1., 1., 1., 1.])]
解决方案
方法1:循环内逐行拼接
修改原循环逻辑,在计算每行结果的同时,将输入行数据与结果拼接:
df_np = df.to_numpy() A, B, C, D, E, F = df_np.T H = 1 - A combined_res = [ np.hstack((df_np[i], fsolve(f2_bis, [1,1,1,1], args=(Ai, Bi, Ci, Di, Ei, Fi, Hi)))) for i, (Ai, Bi, Ci, Di, Ei, Fi, Hi) in enumerate(zip(A, B, C, D, E, F, H)) ]
方法2:批量拼接(高效)
若已得到res列表,可转为数组后与原数据批量合并:
res_np = np.array(res) combined_np = np.hstack((df.to_numpy(), res_np)) combined_res = list(combined_np)
方法3:生成结构化DataFrame(可选)
如果需要便于后续分析的结构化数据,可直接生成新DataFrame:
res_np = np.array(res) new_cols = [f'res_{idx}' for idx in range(res_np.shape[1])] combined_df = pd.DataFrame( np.hstack((df.to_numpy(), res_np)), columns=df.columns.tolist() + new_cols )
这三种方法均可生成目标格式的10列数据集,批量拼接的方法在数据量较大时性能更优。
内容的提问来源于stack exchange,提问作者Luker354
相关产品推荐
相关产品推荐

