如何横向拼接循环生成的行数不同的DataFrame且不丢失数据?
问题描述
原始数据

当前代码
new=[] for i in range(1,len(dfnew.columns)-1, 1): x = np.array(df.iloc[:, i].fillna(0)) y = np.array(df.iloc[:, i+1].fillna(0)) distance,path = fastdtw(x, y, dist = euclidean) for j in range(0,len(path)): new.append([dfnew['Time'].iloc[path[j][0]],dfnew.iloc[:,i].iloc[path[j][0]], dfnew.iloc[:,i+1].iloc[path[j][1]]]) df_sync = pd.DataFrame(data=new,columns=["Time"+ str(i),"Jolt"+ str(i), "Jolt"+str(i+1)]).dropna() #df_sync = pd.concat([new, df_sync], axis=1) print(df_sync)
需求说明
遍历主DataFrame,计算Jolt 1与Jolt 2的欧氏路径(返回路径列表),生成包含Time、Jolt 1、Jolt 2列的DataFrame;下一轮循环计算Jolt 2与Jolt 3的路径,生成包含Time、Jolt 2、Jolt 3列的DataFrame。最终需要将这些DataFrame横向拼接,且不丢失任何信息。
当前输出

解决方案
核心调整点
- 避免复用全局列表存储多轮数据,每轮循环生成独立的同步数据集
- 把每轮生成的DataFrame存入统一列表,循环结束后一次性完成横向拼接
- 优化列名命名规则,避免混淆
修改后代码
# 初始化列表存储每轮生成的同步DataFrame sync_dfs = [] for i in range(1, len(dfnew.columns)-1): x = np.array(df.iloc[:, i].fillna(0)) y = np.array(df.iloc[:, i+1].fillna(0)) distance, path = fastdtw(x, y, dist=euclidean) # 每轮新建临时列表存储当前Jolt配对的数据 temp_data = [] for j in range(len(path)): temp_data.append([ dfnew['Time'].iloc[path[j][0]], dfnew.iloc[:, i].iloc[path[j][0]], dfnew.iloc[:, i+1].iloc[path[j][1]] ]) # 生成当前配对的DataFrame并加入列表 current_df = pd.DataFrame( data=temp_data, columns=[f"Time_{i}", f"Jolt_{i}", f"Jolt_{i+1}"] ).dropna() sync_dfs.append(current_df) # 横向拼接所有DataFrame,outer模式保留全部数据 final_result = pd.concat(sync_dfs, axis=1) print(final_result)
代码说明
- 用
sync_dfs统一管理每轮生成的DataFrame,避免多轮数据交叉污染 - 每轮循环使用
temp_data存储当前Jolt对的同步数据,确保数据集独立 pd.concat默认采用join='outer',会保留所有行的信息,不会丢失数据- 列名改为
Time_i、Jolt_i格式,清晰区分不同Jolt配对的时间和振动数据
内容的提问来源于stack exchange,提问作者Zlatan
相关产品推荐
相关产品推荐

