Jupyter Notebook中DataFrame追加操作失败问题求助
问题解决:DataFrame追加后为空的问题
问题原因
pandas的append()方法不会原地修改原DataFrame,而是返回一个包含追加后数据的新DataFrame。你的函数仅调用了df_a.append(...),但没有将返回结果重新赋值给df_a;同时函数内部默认不会修改外部定义的df_a,导致原DataFrame始终为空。
解决方案
这里提供两种可行的修改方式,同时补充pandas新版本的替代方案:
方案1:让函数返回新的DataFrame,调用时重新赋值
def writeToTable(df_a, df_b): return df_a.append(df_b, ignore_index=True) # 调用函数时更新df_a df_a = writeToTable(df_a, df_loop)
方案2:在函数内部声明全局变量,直接修改原DataFrame
def writeToTable(df_b): global df_a df_a = df_a.append(df_b, ignore_index=True) # 直接调用即可更新df_a writeToTable(df_loop)
推荐:使用pd.concat()替代已弃用的append()
pandas 2.0及以上版本已弃用append()方法,更推荐使用pd.concat(),用法如下:
# 对应方案1的写法 def writeToTable(df_a, df_b): return pd.concat([df_a, df_b], ignore_index=True) df_a = writeToTable(df_a, df_loop) # 对应方案2的写法 def writeToTable(df_b): global df_a df_a = pd.concat([df_a, df_b], ignore_index=True)
优化建议(循环追加场景)
如果是在循环中多次追加数据,多次创建新DataFrame会影响性能。建议先将所有待追加的小DataFrame存入列表,最后一次性合并:
df_list = [] # 循环生成待追加的df_loop for ...: df_loop = ... # 生成你的小DataFrame df_list.append(df_loop) # 一次性合并到df_a df_a = pd.concat([df_a] + df_list, ignore_index=True)
内容的提问来源于stack exchange,提问作者MateMalte
相关产品推荐
相关产品推荐

