为什么函数中的DataFrame.replace()不会更改输入DataFrame

时间:2019-03-30 01:21:31

标签: python pandas function dataframe

这是测试代码

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.",而df2df3产生"USA"

我不明白为什么在DataFrame函数中设置replace1()无效。 replace2()实际上与replace1()一样吗?

我是DataFrame的新手。请指出我的愚蠢。

2 个答案:

答案 0 :(得分: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})

答案 1 :(得分:0)

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使用return返回修改后的值。虽然return 1仅进行更改(df.replace),但不会返回更改后的DataFrame