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

使用函数向Pandas DataFrame添加数据失败,数据丢失如何解决?

问题原因与解决方法

为什么数据会消失?

  1. 函数默认参数的陷阱:Python中函数的默认参数在定义阶段就会被计算并绑定到对象上。你的add_item函数默认参数shopping_list=shopping_list绑定的是定义函数时的初始空DataFrame,后续即使你尝试修改全局的shopping_list,函数调用时默认使用的还是最初的那个空对象。
  2. 未更新变量引用:每次调用add_item都会返回一个拼接后的新DataFrame,但你没有将这个返回值赋值回shopping_list变量,导致原变量始终保持初始状态。

如何正确添加数据到DataFrame?

方案一:显式传入当前DataFrame并更新变量

修改代码,去掉容易出错的默认参数,每次调用时传入当前的shopping_list,并将返回的新DataFrame赋值回变量:

import pandas as pd

# 直接创建带指定列的空DataFrame,避免生成不必要的初始行
shopping_list = pd.DataFrame(columns=["Order", "Type", "Price", "Quantity"])

def add_item(order: str, type_transaction: str, price: float, quantity: int, shopping_list):
    new_item_data = pd.DataFrame({
        "Order": [order],
        "Type": [type_transaction],
        "Price": [price],
        "Quantity": [quantity]
    })
    return pd.concat([shopping_list, new_item_data], ignore_index=True)

# 调用函数时传入当前DataFrame,并更新变量
shopping_list = add_item(order="Buy", type_transaction="Add", price=20.0, quantity=100, shopping_list=shopping_list)
shopping_list = add_item(order="Sell", type_transaction="Add", price=25.0, quantity=200, shopping_list=shopping_list)

print(shopping_list)

方案二:直接修改传入的DataFrame(可选)

如果你希望函数内部直接修改原DataFrame,可以使用loc直接添加行(注意:append方法已被官方弃用):

import pandas as pd

shopping_list = pd.DataFrame(columns=["Order", "Type", "Price", "Quantity"])

def add_item(order: str, type_transaction: str, price: float, quantity: int, shopping_list):
    # 通过loc直接添加新行
    shopping_list.loc[len(shopping_list)] = [order, type_transaction, price, quantity]

# 调用函数后无需重新赋值,直接修改原对象
add_item(order="Buy", type_transaction="Add", price=20.0, quantity=100, shopping_list=shopping_list)
add_item(order="Sell", type_transaction="Add", price=25.0, quantity=200, shopping_list=shopping_list)

print(shopping_list)

运行上述任意一种方案的代码,都能看到DataFrame中正确添加了两行数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:35:24