#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
использует возврат для возврата измененного значения. Whilereturn 1
просто вносит изменение (df.replace
), но не возвращает измененноеDataFrame
.