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

Pandas Concat无法原地修改?添加行后行数未更新求助

DataFrame添加行后行数未更新的问题分析与解决

问题代码

你的函数代码如下:

import pandas as pd
import numpy as np

def add_row(df):
    df_temp_row = pd.DataFrame({'time':[np.nan], 'mid_o':[np.nan], 'mid_h':[np.nan], 'mid_l':[np.nan], 'mid_c':[np.nan]})
    df = pd.concat([df, df_temp_row], ignore_index=True, axis=0, copy=True)
    return df

问题原因

核心问题是变量作用域的赋值逻辑:

  • 函数内部的df = pd.concat(...)只是将局部变量df重新指向了一个新生成的DataFrame对象,并没有修改你传入的原始DataFrame。
  • Jupyter Notebook会自动打印函数的返回值(也就是那个已添加行的新DataFrame),让你误以为原始DataFrame被修改,但实际上原始df变量完全没变化,所以调用len(df.index)时还是原来的行数。

解决办法

1. 正确接收函数返回值

调用函数时,必须将返回的新DataFrame重新赋值给原始变量,让原始变量指向添加行后的对象:

# 错误调用(不会修改原始df)
add_row(df)

# 正确调用(更新原始df)
df = add_row(df)

2. 简化函数逻辑(可选)

不需要额外创建临时DataFrame,直接用loc添加行更高效:

def add_row(df):
    # 直接在末尾添加一行全为NaN的数据,列顺序自动匹配df的列
    df.loc[len(df)] = [np.nan] * len(df.columns)
    return df

如果需要指定列的具体值,也可以明确传入字典:

def add_row(df):
    df.loc[len(df)] = {
        'time': np.nan,
        'mid_o': np.nan,
        'mid_h': np.nan,
        'mid_l': np.nan,
        'mid_c': np.nan
    }
    return df

3. 直接修改原始对象(不推荐)

如果不想返回新对象,也可以直接修改传入的DataFrame,但这种方式容易引发副作用(比如其他引用该对象的代码会意外被影响):

def add_row(df):
    df_temp_row = pd.DataFrame({'time':[np.nan], 'mid_o':[np.nan], 'mid_h':[np.nan], 'mid_l':[np.nan], 'mid_c':[np.nan]})
    # 替换df的内容而非重新赋值变量
    df[:] = pd.concat([df, df_temp_row], ignore_index=True, axis=0, copy=True)

验证方法

修改调用方式后,再执行len(df.index)就能看到行数正确增加了。

内容的提问来源于stack exchange,提问作者user3316115

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:12:20