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

基于多条件为DataFrame分配已有列——Python实现求助

根据性别和年龄匹配对应列生成新列(Python实现)

先还原你的示例数据:

import pandas as pd

data = {
    'sex': ['M', 'M'],
    'age': [63, 63],
    'malechild': ['0-1', '0-2'],
    'maleadult': ['0-2', '0-4'],
    'maleold': ['0-3', '0-6'],
    'femalechild': ['0-0.9', '0-1.9'],
    'femaleadult': ['0-1.9', '0-2.9'],
    'femaleold': ['0-2.9', '0-3.9']
}
df = pd.DataFrame(data)

方案1:自定义函数+apply(直观易读,适合小数据集)

首先定义年龄分组规则(可根据实际需求调整):

def get_age_group(age):
    if age < 18:
        return 'child'
    elif 18 <= age <= 60:
        return 'adult'
    else:  # 60岁以上
        return 'old'

然后编写每行的匹配逻辑:

def pick_range(row):
    # 拼接目标列名:性别小写+年龄组
    target_col = f"{row['sex'].lower()}{get_age_group(row['age'])}"
    return row[target_col]

# 生成新列
df['range'] = df.apply(pick_range, axis=1)
# 提取需要的列
result = df[['sex', 'age', 'range']]

运行后result就是你要的输出:

sex  age range
0   M   63  0-3
1   M   63  0-6

方案2:宽表转长表(melt+merge,高效适合大数据集)

逐行apply在数据量大时效率较低,用转表合并的方式更高效:

  1. 先给每行加索引,生成目标列名:
df['idx'] = df.index
df['age_group'] = df['age'].apply(get_age_group)
df['target_col'] = df['sex'].str.lower() + df['age_group']
  1. 把原数据的范围列转成长格式:
melted_df = df.melt(
    id_vars=['idx'],
    value_vars=['malechild', 'maleadult', 'maleold', 'femalechild', 'femaleadult', 'femaleold'],
    var_name='col_name',
    value_name='range'
)
  1. 合并匹配结果:
result = df[['idx', 'sex', 'age', 'target_col']].merge(
    melted_df,
    left_on=['idx', 'target_col'],
    right_on=['idx', 'col_name'],
    how='left'
)
# 整理最终列
result = result[['sex', 'age', 'range']]

注意事项

  • 年龄分组规则完全可自定义,修改get_age_group函数即可适配任意年龄区间
  • 确保原DataFrame的范围列名严格遵循{小写性别}{年龄组}的格式(比如femaleadult),如果列名格式不同,只需调整target_col的拼接逻辑
  • 若性别有其他取值(如'F'),只要sex.lower()能匹配列名前缀即可正常工作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 23:51:13