函数内循环处理DataFrame列生成哑变量,原DataFrame未更新求助
问题原因
你写的函数之所以没修改原DataFrame,核心是Python的变量引用机制:
- 函数接收的
df是外部DataFrame的引用,但当执行df = pd.concat([df, temp_dum], axis=1)时,局部变量df被重新绑定到了pd.concat生成的新DataFrame对象上,和外部传入的原df彻底断开了关联。 - 后续对这个局部
df的修改(比如drop)都只作用在新对象上,原DataFrame完全没被改动。
两种解决办法
方法1:让函数返回修改后的DataFrame,外部重新赋值
修改函数,最后返回处理后的df,调用时覆盖原变量:
def cols_to_dummies(df, cols: list): for c in cols: temp_dum = pd.get_dummies(df[str(c)]) df = pd.concat([df, temp_dum], axis=1) df.drop(str(c), axis=1, inplace=True) return df
调用方式:
cols = ['column1', 'column2'] df = cols_to_dummies(df, cols) # 用返回的新df覆盖原变量
方法2:一次性生成所有哑变量(更简洁高效)
没必要循环处理每一列,pd.get_dummies支持直接传入列列表,一次性生成所有指定列的哑变量,代码更简洁:
def cols_to_dummies(df, cols: list): # 生成指定列的哑变量,给每个列的哑变量加上前缀区分 dummies = pd.get_dummies(df[cols], prefix=cols) # 合并原df(移除指定列)和哑变量 return df.drop(cols, axis=1).join(dummies)
调用方式和方法1一样:
cols = ['column1', 'column2'] df = cols_to_dummies(df, cols)
内容的提问来源于stack exchange,提问作者Egorsky
相关产品推荐
相关产品推荐

