gpt4 book ai didi

python - 使用列表理解时数据框被覆盖

转载 作者:行者123 更新时间:2023-12-01 06:21:45 25 4
gpt4 key购买 nike

我正在尝试通过列表理解创建四个新的 pandas 数据框。每个新数据框应该是原始的“constituents_list”数据框,具有两个新列。这两列将定义的年数添加到现有列并返回值。示例代码如下

def add_maturity(df, tenor):
df['tenor'] = str(tenor) + 'Y'
df['maturity'] = df['effectivedate'] + pd.DateOffset(years=tenor)
return df

year_list = [3, 5, 7, 10]
new_dfs = [add_maturity(constituents_file, tenor) for tenor in year_list]

我在 new_dfs 列表中的预期输出应该有四个数据帧,每个数据帧都有不同的“tenor”和“maturity”值。在我的结果中,所有四个数据帧都具有相同的数据,“期限”为“10Y”,“成熟度”比“有效日期”列长 10 年。

我怀疑每次迭代列表理解时,每个现有数据帧都会被最新的函数调用覆盖。我只是不知道如何阻止这种情况发生。

非常感谢

最佳答案

当您分配给 DataFrame 对象时,您正在就地进行修改。当您将其作为参数传递给函数时,您传递的是对 DataFrame 对象的引用,在本例中每次都是对相同 DataFrame 对象的引用,因此会覆盖之前的数据结果。

要解决此问题,您可以在函数开头创建 DataFrame 的副本:

def add_maturity(df, tenor):
df = df.copy()
df['tenor'] = str(tenor) + 'Y'
df['maturity'] = df['effectivedate'] + pd.DateOffset(years=tenor)
return df

(或者您可以保持函数不变,并让调用者在将 DataFrame 作为参数传递时首先复制 DataFrame...)

或者您可以使用 assign() 方法,该方法返回一个包含修改后的列的新 DataFrame:

def add_maturity(df, tenor):
return df.assign(
tenor= str(tenor) + 'Y',
maturity=df['effectivedate'] + pd.DateOffset(years=tenor),
)

(就我个人而言,我会选择后者。它与大多数 DataFrame 方法的工作方式类似,因为它们通常返回一个新的 DataFrame,而不是就地修改它。)

关于python - 使用列表理解时数据框被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60325287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com