Когда вы присваиваете объекту 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
(Или вы можете оставить функцию как есть, и иметь caller сначала скопируйте DataFrame при передаче его в качестве аргумента ...)
Или вы можете использовать метод assign()
, который возвращает новый DataFrame с измененными столбцами:
def add_maturity(df, tenor):
return df.assign(
tenor= str(tenor) + 'Y',
maturity=df['effectivedate'] + pd.DateOffset(years=tenor),
)
(Лично я бы go с последним. Это похоже на то, как работает большинство методов DataFrame, в том, что они обычно возвращают новый DataFrame, а не изменяют его на месте.)