Pandas:通过条件替换单元格值(标准化性别字符串输入)
程序化实现方案
方案1:用str.contains+loc批量匹配替换
这是最贴合需求的向量式实现,直接基于字符串包含关系定位目标行,效率远高于循环:
import pandas as pd # 构造示例数据集 data = { 'id': [1,2,3,4,5,6,7,8,9], 'Gender': ['F','Fem','male','She/Her','Male','Non-bianary','M','female','Male'], 'Age': [22,18,45,30,25,26,18,20,56] } df = pd.DataFrame(data) # 统一转大写,避免大小写导致的匹配遗漏 df['Gender'] = df['Gender'].str.upper() # 匹配含"F"的行,替换为Female df.loc[df['Gender'].str.contains('F'), 'Gender'] = 'Female' # 匹配含"M"的行,替换为Male df.loc[df['Gender'].str.contains('M'), 'Gender'] = 'Male'
执行后,Gender列会变为:['Female','Female','Male','She/Her','Male','Non-bianary','Male','Female','Male']
方案2:用numpy.where简化多条件判断
如果想把逻辑写得更紧凑,可以用np.where嵌套实现:
import pandas as pd import numpy as np df = pd.DataFrame(data) df['Gender'] = df['Gender'].str.upper() # 优先匹配F,再匹配M,其余保持原内容 df['Gender'] = np.where( df['Gender'].str.contains('F'), 'Female', np.where( df['Gender'].str.contains('M'), 'Male', df['Gender'] ) )
方案3:自定义函数+apply(灵活扩展)
如果后续需要添加更复杂的规则(比如把She/Her也归为Female),可以写自定义函数批量处理:
def standardize_gender(gender): g = str(gender).upper() if 'F' in g or 'SHE' in g: return 'Female' elif 'M' in g: return 'Male' else: return gender # 不匹配的内容保持原样 df['Gender'] = df['Gender'].apply(standardize_gender)
原循环写法的问题说明
你之前的循环思路有两个核心问题:
df[df.Gender == i] = 'Female'会修改整行的所有列,而不是仅修改Gender列,正确写法应为df.loc[df.Gender == i, 'Gender'] = 'Female'- 遍历Series的循环在pandas里效率极低,远不如向量式操作(上面的三种方案都是向量式,处理大数据集时差距会非常明显)
内容的提问来源于stack exchange,提问作者KevOMalley743
相关产品推荐
相关产品推荐

