基于Pandas的数据清洗:如何处理含特殊值的年龄列以适配EDA?
针对含特殊取值年龄列的EDA适配清洗方案
以下是几种实用的清洗逻辑,可根据你的数据集规模、业务背景和EDA目标选择:
区间映射为数值代表值
把模糊的区间取值转化为具体数值,方便后续的统计分析:- 对于
<9,可以取区间中点4(覆盖0-8岁范围),或者业务上更合理的上限8; - 对于
10+,如果没有明确上限,取区间最小值10;若能推断出合理范围(比如10-18岁),取中点14; - 对于
>45,取区间起始值46,或结合数据集其他年龄分布取常见的区间中点(比如46-60岁的中点53);
示例代码(Python pandas):
def clean_age(age_val): if age_val == '<9': return 4 elif age_val == '10+': return 10 elif age_val == '>45': return 46 else: return int(age_val) if str(age_val).isdigit() else pd.NA df['cleaned_age'] = df['age'].apply(clean_age)- 对于
转化为分类年龄组
保留原始区间的业务含义,将年龄划分为分组变量,适合做分组对比分析:- 自定义区间标签,比如:
儿童(<9)、青少年(10-18)、成年(19-45)、中老年(>45); - 这种方式避免了硬编码数值带来的偏差,能更直观展示不同群体的特征差异;
示例代码:
# 先把特殊值转为可用于分箱的数值 df['temp_age'] = df['age'].replace({'<9': 8, '10+': 10, '>45': 46}) df['temp_age'] = pd.to_numeric(df['temp_age'], errors='coerce') df['age_group'] = pd.cut(df['temp_age'], bins=[-float('inf'), 9, 19, 45, float('inf')], labels=['儿童', '青少年', '成年', '中老年'])- 自定义区间标签,比如:
标记为缺失值单独处理
如果不确定特殊取值的合理映射,或者这类样本占比极低,可以将其标记为缺失值(NaN):- 在EDA阶段单独统计缺失样本的占比,分析其是否存在分布偏差(比如是否集中在某些特征维度);
- 这种方式避免了错误赋值导致的分析偏差,适合数据量充足的场景;
示例代码:
df['cleaned_age'] = pd.to_numeric(df['age'], errors='coerce') # 把特殊符号的行标记为缺失 df.loc[df['age'].isin(['<9', '10+', '>45']), 'cleaned_age'] = pd.NA结合业务规则精细化映射
如果有业务背景支撑(比如数据来自儿童教育调研,10+特指10-12岁),可以基于业务知识确定更精准的映射:- 比如医疗场景中,
>45可能对应45-65岁的高危人群,可参考行业标准确定区间代表值; - 这种方式能最大程度保留数据的业务价值,让EDA结果更贴合实际业务场景。
- 比如医疗场景中,
内容的提问来源于stack exchange,提问作者Ronit Kataria
相关产品推荐
相关产品推荐

