Pandas如何自定义函数批量替换指定多列的0/1值为No/Yes
问题说明
运行环境:Pandas 1.4.2,Python 3.9.12
当前数据集的Scholarship、Hipertension、Diabetes、Alcoholism、SMS_received等列以0、1分别指代'No'、'Yes',数据集样例如下:
Scholarship Hipertension Diabetes Alcoholism SMS_received 0 0 1 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 0 4 0 1 1 0 0
初始编写的替换函数存在逻辑错误,传入单个列时会误替换全表所有0/1值,无法支持传入列名列表批量处理指定列的需求,初始函数代码如下:
def replace_values(data_frame, column, being_replaced, replacement_value): data_frame[column] = df[column].replace(to_replace=being_replaced, value= replacement_value) return df
预期调用效果为传入DataFrame、待处理列名列表、待替换值列表、对应替换值列表,即可一次性完成指定列的值替换,调用示例:
replace_values(df, [*list_of_columns*], [0, 1], ['No', 'Yes'])
解决方案
该需求可以直接实现,不需要额外编写显式循环逻辑,Pandas原生支持对多列组成的子集做批量值替换。初始函数的核心问题有两个:
- 变量作用域错误:函数入参名为
data_frame,内部替换时却调用了全局变量df,导致替换范围不受入参控制 - 语法缩进错误:
return语句没有缩进至函数体内,不属于函数逻辑的一部分
修正后的可直接使用的函数代码如下:
def replace_values(data_frame, target_columns, being_replaced, replacement_value): # 仅对传入的目标列集合执行替换,不改动其他列数据 data_frame[target_columns] = data_frame[target_columns].replace( to_replace=being_replaced, value=replacement_value ) return data_frame
调用方式
将需要处理的列名组装为列表传入即可,示例:
# 定义需要处理的列列表 process_cols = ['Scholarship', 'Hipertension', 'Diabetes', 'Alcoholism', 'SMS_received'] # 执行替换 df = replace_values(df, process_cols, [0, 1], ['No', 'Yes'])
说明
- 该函数同时兼容传入单个列名(字符串格式)和多个列名(列表格式)的场景,不需要额外写类型判断逻辑
- 替换操作仅作用于传入的目标列,数据集其他列的0、1值不会被改动
- 注意不要在函数内部混用全局DataFrame变量名,所有操作基于入参
data_frame执行即可避免全表误修改问题
内容的提问来源于stack exchange,提问作者Wildo_Baggins311
相关产品推荐
相关产品推荐

