基于多条件为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在数据量大时效率较低,用转表合并的方式更高效:
- 先给每行加索引,生成目标列名:
df['idx'] = df.index df['age_group'] = df['age'].apply(get_age_group) df['target_col'] = df['sex'].str.lower() + df['age_group']
- 把原数据的范围列转成长格式:
melted_df = df.melt( id_vars=['idx'], value_vars=['malechild', 'maleadult', 'maleold', 'femalechild', 'femaleadult', 'femaleold'], var_name='col_name', value_name='range' )
- 合并匹配结果:
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
相关产品推荐
相关产品推荐

