python - 为什么通过我的函数传递这个数据帧会改变原始数据帧?
问题描述
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
我编写了这个函数来帮助我从资产列表中计算加权回报。
我有一个价格数据框(索引是时间)并遍历每一列,并将该列乘以特定权重(权重是一个列表,与列的顺序相同)。
我正在创建一个新列,因此我可以仔细检查代码是否按预期工作(保留原始返回)。
我通过函数传递原始数据帧,并将函数设置为等于一个新变量。
新变量结果是正确的——但旧数据框也发生了变化!我不确定它为什么会改变。我认为传递给函数的变量只是一个副本,原始数据框将保持原样。
解决方案
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 又是同一个对象。
推荐阅读
- c++ - 找不到 Glog(缺少:GLOG_INCLUDE_DIR GLOG_LIBRARY)
- javascript - 在数组中查找序列的第一个索引
- julia - 在Julia中生成具有两个值的所有项目组合?
- string - 在最后一个“/”字符之后从字符串的最后一部分创建变量
- javascript - 如何将自定义字体的文本保存到 .txt/.png/.pdf 文件?
- python - python - 组合 3 个数据框,但需要按 1 列中的值重新对齐数据
- android - Android Kotlin 如何从 Firebase 获取记录
- oracle - 尝试从 Windows 目录读取 BLOB 时出现 ORA-22288
- r - 如何计算 Accuracy F1-Score Precision Sensitivity 等
- php - PHP 正则表达式 preg_match:未知修饰符