Pandas назначение и копирование - PullRequest
1 голос
/ 04 апреля 2020

Если мы запустим следующий код,

def f(df):
    df = df.assign(b = 1)
    df["a"] = 1

df = pd.DataFrame(np.random.randn(100, 1))
f(df)
print(df)

Мы получим

           0
0   1.298967
1  -0.887922
2   1.913559
3  -0.082032
4  -0.466594
..       ...
95 -0.845137
96  0.628542
97 -0.588897
98  0.464374
99  0.267946

Тогда как, если мы запустим следующий код,

def f(df):
    df = df
    df["a"] = 1

df = pd.DataFrame(np.random.randn(100, 1))
f(df)
print(df)

Мы получим

           0  a
0  -0.510875  1
1   0.401580  1
2  -0.037484  1
3  -0.935115  1
4  -1.108471  1
..       ... ..
95  0.362075  1
96 -1.017991  1
97  1.881081  1
98  0.376828  1
99  0.771661  1

Я знаю, что в python есть концепция передачи по ссылке на объект. Почему df во втором коде не копируется? Спасибо

1 Ответ

2 голосов
/ 04 апреля 2020

Для первой функции:

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

Надеюсь, что это ответ на ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...