如何使用Pandas在同一行不同列向DataFrame追加值
Pandas append() 导致数据分散多行,实现拟合结果同行存储的解决方法
问题场景
使用Pandas创建多DataFrame存储lmfit拟合结果时,多次调用append()导致每个字段被追加到单独行,数据无法在同一行对齐。
初始创建DataFrame的代码
for delay_index in range(len(delays)): with open(f'Delay_'+str(delay_index)+'.txt','w+'): df[delay_index] = pd.DataFrame() df[delay_index] = pd.DataFrame(columns=['Field'] + [f'{name}_I0' for name in peak_names])
错误的结果写入代码
for delay_index in range(len(delays)): df[delay_index]=df[delay_index].append({'Field':b}, ignore_index=True) for name in peak_names: param_name = f'{name}_I_{delay_index}' df[delay_index] = df[delay_index].append({f'{name}_I0':result.params[param_name].value}, ignore_index=True)
问题现象
数据被分散到多行,无法对齐:
Field p1_I0 p2_I0 p3_I0 p4_I0 709.97 2149603.9483728814 2304388.805528784 2803053.0849080454 2985452.31396472 498.88 2052931.2878375147 2200678.495335952 2682353.9101734087 2839037.5609275587
期望结果
所有字段值在同一行呈现:
Field p1_I0 p2_I0 p3_I0 p4_I0 709.97 2149603.9483728814 2304388.805528784 2803053.0849080454 2985452.31396472 498.88 2052931.2878375147 2200678.495335952 2682353.9101734087 2839037.5609275587
解决方案
方法1:指定行索引,使用at方法赋值
通过确定目标行索引,直接使用at方法在对应行的指定列上赋值,避免多次调用append()产生新行:
for delay_index in range(len(delays)): i=int(expno.index(num)) df[delay_index].at[i, 'Field'] = b for name in peak_names: param_name = f'{name}_I_{delay_index}' df[delay_index].at[i, f'{name}_I0'] = result.params[param_name].value
方法2:构造完整行数据后一次性append
提前组装好整行的字典数据,再调用一次append()写入,也能避免多行零散问题:
for delay_index in range(len(delays)): row_data = {'Field': b} for name in peak_names: param_name = f'{name}_I_{delay_index}' row_data[f'{name}_I0'] = result.params[param_name].value df[delay_index] = df[delay_index].append(row_data, ignore_index=True)
原理说明
append()每次调用都会生成新的单行DataFrame并追加到原数据中,多次调用自然产生多行零散数据。而at方法可直接定位到指定行和列的位置赋值,或一次性写入整行数据,都能确保所有字段落在同一行。
内容的提问来源于stack exchange,提问作者h2ozy
相关产品推荐
相关产品推荐

