使用函数向Pandas DataFrame添加数据失败,数据丢失如何解决?
问题原因与解决方法
为什么数据会消失?
- 函数默认参数的陷阱:Python中函数的默认参数在定义阶段就会被计算并绑定到对象上。你的
add_item函数默认参数shopping_list=shopping_list绑定的是定义函数时的初始空DataFrame,后续即使你尝试修改全局的shopping_list,函数调用时默认使用的还是最初的那个空对象。 - 未更新变量引用:每次调用
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
相关产品推荐
相关产品推荐

