Python中循环生成不同长度DataFrame的追加合并方法求助
解决循环中合并多个DataFrame的问题
你原来的代码问题在于直接给table的列赋值会覆盖原有数据,而不是追加。要实现类似SQL UNION的效果,推荐以下两种高效方法:
方法一:先收集所有子DataFrame,最后一次性合并(推荐)
这种方式性能更优,尤其是循环次数多或数据量大时,避免多次重复合并操作。
import pandas as pd # 假设你用sklearn做线性回归,根据实际情况替换 from sklearn.linear_model import LinearRegression # 初始化空列表用于存储每个循环生成的子DataFrame dfs_list = [] for x in ['a', 'b', 'c']: for y in ['d', 'e', 'f']: # 过滤数据 filtered_df = df[(df['col_1'] == x) & (df['col_2'] == y)] # 跳过空数据,避免后续报错 if filtered_df.empty: continue s1 = filtered_df['col_3'] # 这里替换成你实际的线性回归逻辑,生成和s1长度一致的预测序列s2 # 示例:用col_3作为特征训练模型生成预测(仅作演示,根据你的数据调整) model = LinearRegression() X = s1.values.reshape(-1, 1) target = s1.values # 替换为你的真实目标变量 model.fit(X, target) s2 = model.predict(X) # 生成当前循环的子DataFrame current_df = pd.DataFrame({ 'col_x': [x] * len(filtered_df), 'col_y': [y] * len(filtered_df), 'col_3': s1, 'predict': s2 }) # 将子DataFrame加入列表 dfs_list.append(current_df) # 合并所有子DataFrame,ignore_index重置索引 final_table = pd.concat(dfs_list, ignore_index=True)
方法二:每次循环直接追加到主DataFrame
如果循环次数少,也可以每次循环合并,但性能略差于方法一:
import pandas as pd from sklearn.linear_model import LinearRegression # 初始化空的主DataFrame final_table = pd.DataFrame(columns=['col_x', 'col_y', 'col_3', 'predict']) for x in ['a', 'b', 'c']: for y in ['d', 'e', 'f']: filtered_df = df[(df['col_1'] == x) & (df['col_2'] == y)] if filtered_df.empty: continue s1 = filtered_df['col_3'] # 生成s2的逻辑同上 model = LinearRegression() X = s1.values.reshape(-1, 1) target = s1.values model.fit(X, target) s2 = model.predict(X) current_df = pd.DataFrame({ 'col_x': [x] * len(filtered_df), 'col_y': [y] * len(filtered_df), 'col_3': s1, 'predict': s2 }) # 追加到主DataFrame final_table = pd.concat([final_table, current_df], ignore_index=True)
关键注意事项
- 必须处理
filtered_df为空的情况,否则会生成空的子DataFrame,影响最终结果。 - 确保每个子DataFrame的列名和主DataFrame完全一致,否则合并后会出现缺失值(NaN)。
- 如果
s2是pandas.Series类型,可以直接赋值给current_df的列,无需转成数组。
内容的提问来源于stack exchange,提问作者Horaci
相关产品推荐
相关产品推荐

