循环拼接DataFrame时仅覆盖未追加的问题与修复方案
问题原因
你这段代码的核心问题是每次循环都用初始空DataFrame df_c 和当前生成的 df_b 拼接,然后把结果覆盖赋值给 df_final。这就导致每次循环都会丢弃之前的拼接结果,最终只保留最后一次循环生成的 df_b 数据。
修复方案
推荐用列表收集所有子DataFrame,最后一次性拼接——这种方式比循环内反复拼接效率高得多,避免了重复复制数据的开销:
import pandas as pd columns = ['Col1','Col2', 'Col3'] step_a = 1 step_b = 7 # 初始化列表存每个循环生成的子DataFrame df_list = [] while step_b <= 601: service = df.columns[step_a] last_slash_index = service.rfind('/') last_dot_index = service.rfind('.') service = service[last_slash_index + 1:last_dot_index] df_selected = df.iloc[:,[0] + list(range(step_a, step_b))] # 简化代码:直接用values生成DataFrame并指定列名 df_b = pd.DataFrame(df_selected.values, columns=columns) df_b['Service'] = service # 将当前子DataFrame加入列表 df_list.append(df_b) step_a += 6 step_b += 6 # 一次性拼接所有子DataFrame,重置索引避免重复 df_final = pd.concat(df_list, axis=0, ignore_index=True) df_final.to_csv('table1-final.csv')
如果坚持要在循环内逐步拼接(仅推荐小数据场景),可以修改为每次用已有的df_final和新的df_b拼接:
import pandas as pd columns = ['Col1','Col2', 'Col3'] step_a = 1 step_b = 7 # 提前初始化包含Service列的空DataFrame df_final = pd.DataFrame(columns=columns + ['Service']) while step_b <= 601: service = df.columns[step_a] last_slash_index = service.rfind('/') last_dot_index = service.rfind('.') service = service[last_slash_index + 1:last_dot_index] df_selected = df.iloc[:,[0] + list(range(step_a, step_b))] df_b = pd.DataFrame(df_selected.values, columns=columns) df_b['Service'] = service # 用当前df_final和新df_b拼接,重置索引 df_final = pd.concat([df_final, df_b], axis=0, ignore_index=True) step_a += 6 step_b += 6 df_final.to_csv('table1-final.csv')
额外优化提示
- 原代码中
df_b = df_selected.values再转DataFrame的步骤可以直接合并,省去中间变量。 - 拼接时添加
ignore_index=True能让最终DataFrame的索引连续,避免出现重复索引的问题。
内容的提问来源于stack exchange,提问作者Behseini
相关产品推荐
相关产品推荐

