Почему DataFrame.replace () внутри функции не меняет входной DataFrame - PullRequest
0 голосов
/ 30 марта 2019

Вот тестовый код

df1 = pd.DataFrame({'Country':['U.S.A.']})
df2 = df1.copy()
df3 = df1.copy()

def replace1(df, col, mapVals):
    df = df.replace({col: mapVals})

def replace2(df, col, mapVals):
    return df.replace({col: mapVals})

def replace3(df, col, mapVals):
    df.replace({col: mapVals}, inplace=True)

replace1(df1, 'Country', {'U.S.A.':'USA'})
df2 = replace2(df2, 'Country', {'U.S.A.':'USA'})
replace3(df3, 'Country', {'U.S.A.':'USA'})

print(df1)
print(df2)
print(df3)

df1 производит "U.S.A.", в то время как df2 и df3 производит "USA"

Я не понимаю, почему установка DataFrame в функции replace1() не работает.Разве replace2() фактически не совпадает с replace1()?

Я новичок в DataFrame.Пожалуйста, укажите на мою глупость.

Ответы [ 2 ]

1 голос
/ 30 марта 2019

В функции replace1 вы устанавливаете вывод df.replace({col: mapVals}) для новой переменной с тем же именем: df.То есть вы не изменяете значения исходного объекта, который вы предоставляете в качестве входных данных.

По сути, это то, что вы делаете:

def replace1(df, col, mapVals):
    temp = df.replace({col: mapVals})
    df = temp      # Creating a variable that will overwrite the original input variable

То есть df больше не являетсятот же объект.


Однако это может быть другой альтернативой:

def replace1(df, col, mapVals):
    df.iloc[:, :] = df.replace({col: mapVals})
0 голосов
/ 30 марта 2019

В replace1 вы должны вернуть df (аналогично replace2), поскольку ваше изменение не выполняется на месте (как вы сделали с replace3).

def replace1(df, col, mapVals):
    df = df.replace({col: mapVals})
    return df

И при вызове вам нужно захватить возвращенный объект (см. Возвращаемые значения из здесь )

df1 = replace1(df1, 'Country', {'U.S.A.':'USA'})

Также Не является ли replace2 () таким же, как replace1 ()?

  • Нет. replace2 использует возврат для возврата измененного значения. Хотя return 1 просто вносит изменения (df.replace), но не возвращает измененные DataFrame.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...