You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

原循环写法的问题说明

你之前的循环思路有两个核心问题:

  1. df[df.Gender == i] = 'Female'会修改整行的所有列,而不是仅修改Gender列,正确写法应为df.loc[df.Gender == i, 'Gender'] = 'Female'
  2. 遍历Series的循环在pandas里效率极低,远不如向量式操作(上面的三种方案都是向量式,处理大数据集时差距会非常明显)

内容的提问来源于stack exchange,提问作者KevOMalley743

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 05:30:44