You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Pandas DataFrame中对数值数据分箱?含年龄分组场景

嘿,我来帮你搞定这个300万行DataFrame的年龄分组问题~首先得说,你原来的循环写法在百万级数据上会超级慢,而且还有几个小问题:比如直接引用整个列(complete.Age_units)而不是每行的具体值,Python里逻辑与是小写的and不是AND,条件写法也得规范(比如要写成x > 1 and x < 18而不是>1 AND <18)。

咱们换成Pandas的矢量化操作来处理,既高效又简洁,百万级数据秒处理:

第一步:统一所有年龄为“年”单位

根据你说的规则——超过1岁的个体都用Y(年)单位,所以D(天)和W(周)对应的年龄肯定≤1岁。咱们先把所有年龄转换成以年为单位的数值,用np.select实现完全矢量化,比循环快N倍:

import pandas as pd
import numpy as np

# 假设你的DataFrame名为complete
# 定义转换条件和对应操作
conditions = [
    complete['Age_units'] == 'Y',
    complete['Age_units'] == 'D',
    complete['Age_units'] == 'W'
]
choices = [
    complete['Age'],               # 年单位直接用原数值
    complete['Age'] / 365,         # 天转年
    complete['Age'] / 52           # 周转年
]

# 生成统一的年龄(年)列
complete['Age_in_years'] = np.select(conditions, choices, default=np.nan)
第二步:快速划分年龄区间

接下来用pd.cut来生成AgeRange列,这是Pandas专门用来处理区间分组的工具,完全矢量化,效率拉满:

# 定义区间边界和对应标签
bins = [-np.inf, 2, 18, 35, 65, np.inf]
labels = ['<2', '2-18', '18-35', '35-65', '65+']

# 生成AgeRange列,include_lowest=True确保极小值(比如0岁)被分到第一个区间
complete['AgeRange'] = pd.cut(
    complete['Age_in_years'],
    bins=bins,
    labels=labels,
    include_lowest=True
)

为什么不用循环?

300万行数据用for循环遍历的话,可能要花几分钟甚至更久,而矢量化操作是Pandas底层用C实现的,处理百万级数据只需要几秒,效率差好几个数量级。

额外小提示

  • 如果数据里有缺失的年龄/单位,pd.cut会返回NaN,你可以用complete['AgeRange'] = complete['AgeRange'].fillna('未知')来统一处理;
  • 要是你对区间边界的开闭有特殊要求(比如想让2岁刚好分到2-18),可以调整bins或者right参数(pd.cut默认是左开右闭)。

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

火山引擎 最新活动