Почему DataFrame.replace() внутри функции не изменяет входной фрейм данных

#python #pandas #function #dataframe

#python #pandas #функция #фрейм данных

Вопрос:

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

 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." while df2 и df3 produce "USA"

Я не понимаю, почему настройка DataFrame внутри replace1() функции не работает. replace2() Фактически это не то же самое, что replace1() ?

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

Ответ №1:

В функции 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})
  

Ответ №2:

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

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

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

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

Кроме того, разве replace2() фактически не совпадает с replace1()?

  • Нет. replace2 использует возврат для возврата измененного значения. While return 1 просто вносит изменение ( df.replace ), но не возвращает измененное DataFrame .