You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环拼接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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 20:24:52