Для первой функции:
def f(df):
df = df.assign(b = 1)
df["a"] = 1
df = pd.DataFrame(np.random.randn(100, 1))
f(df)
print(df) #doesnot return the changed columns
Вы изменяете ввод на .copy()
версию ввода, так как assign
возвращает копию фактического кадра данных, из документов:
Возвращает новый объект со всеми исходными столбцами в дополнение к новым. Существующие столбцы, которые будут переназначены, будут перезаписаны.
Чтобы вернуть изменения, внесенные в копию, вы должны вернуть копию:
def f(df):
df = df.assign(b = 1)
df["a"] = 1
return df
df = pd.DataFrame(np.random.randn(100, 1))
print(f(df))
Напротив, для Ваша вторая функция, вы назначаете столбец a входному параметру на месте, поэтому, когда вы печатаете информационный кадр, вы можете увидеть изменения в оригинальном df.
def f(df):
df = df
df["a"] = 1
df = pd.DataFrame(np.random.randn(100, 1))
f(df)
print(df)
Чтобы добиться аналогичного поведения для первая функция попробуйте присвоить df = df.copy()
def f(df):
df = df.copy()
df["a"] = 1
df = pd.DataFrame(np.random.randn(100, 1))
f(df)
print(df) # doesnot return the a column
Так же, как мы сделали для функции 1, вы должны вернуть копию:
def f(df):
df = df.copy()
df["a"] = 1
return df
df = pd.DataFrame(np.random.randn(100, 1))
print(f(df)) #returns the column a
Надеюсь, что это ответ на ваш вопрос.