首页 > 解决方案 > 为什么通过我的函数传递这个数据帧会改变原始数据帧?

问题描述

def index_data(self, weights, price_data):
    i = 0
    for column in price_data: 
        price_data[column+'_weighted']=price_data[column]*weights[i]
        i=i+1
    return price_data

我编写了这个函数来帮助我从资产列表中计算加权回报。

我有一个价格数据框(索引是时间)并遍历每一列,并将该列乘以特定权重(权重是一个列表,与列的顺序相同)。

我正在创建一个新列,因此我可以仔细检查代码是否按预期工作(保留原始返回)。

我通过函数传递原始数据帧,并将函数设置为等于一个新变量。

新变量结果是正确的——但旧数据框也发生了变化!我不确定它为什么会改变。我认为传递给函数的变量只是一个副本,原始数据框将保持原样。

标签: pythonpandasdataframe

解决方案


Python 通过赋值传递参数。

考虑一下:

import pandas as pd
df1 = pd.DataFrame([1,2,3])
df2 = df1
df2[0][1] = 9
print(df1)

你会看到它df1被修改了,即使你只修改了df2. 这是因为df2没有分配 的副本df1,而是分配了相同的对象。传递给函数时也会发生同样的情况。https://docs.python.org/3/faq/programming.html#how-do-i-write-a-function-with-output-parameters-call-by-reference

请注意,您返回的 DataFrame 又是同一个对象。


推荐阅读