修改函数内的索引 DataFrame 会更改原始变量

Modifying an indexed DataFrame inside a function changes the original variable

以下脚本在调用 df_lower 之前和之后两次打印相同的输入变量 input_df

import pandas as pd

def df_lower(df):
    cols = ['col_1']
    df[cols] = df[cols].applymap(lambda x: x.lower())
    return df

input_df = pd.DataFrame({
    'col_1': ['ABC'],
    'col_2': ['XYZ']
})

print(input_df)
processed_df = df_lower(input_df)
print(input_df)

输出显示input_df变化:

  col_1 col_2
0   ABC   XYZ
  col_1 col_2
0   abc   XYZ

为什么input_df被修改了?

为什么在处理完整 input_df(无列索引)时不修改?

def df_lower_no_indexing(df):
    df = df.applymap(lambda x: x.lower())
    return df

您正在分配输入数据帧的一部分。 在 无索引 的情况下,您只是将新值分配给局部变量 df:

df = df.applymap(lambda x: x.lower())

创建一个新变量,保持输入不变。

相反,在第一种情况下,您正在为输入的一部分赋值,因此修改输入本身:

df[cols] = df[cols].applymap(lambda x: x.lower())

通过简单的更改,您也可以在第一种情况下创建一个新变量:

def df_lower(df):
    cols = ['col_1']
    df = df[[col for col in df.columns if col not in cols]]
    df[cols] = df[cols].applymap(lambda x: x.lower())
    return df