如何在Pandas中统计各年龄区间可覆盖的区间数量?
解决方法
要实现统计每个年龄区间能完全包含的其他区间数量,可按以下步骤操作:
步骤1:拆分年龄区间为数值列
先把字符串格式的年龄区间拆分成起始值和结束值并转为整数,方便后续做区间包含关系的比较。
步骤2:计算每个区间的包含数量
利用矩阵广播的方式高效比较每个区间与所有区间的包含关系:当当前区间的起始值 ≤ 目标区间的起始值,且当前区间的结束值 ≥ 目标区间的结束值时,说明当前区间完全包含目标区间,统计这类目标区间的总数。
完整代码实现
import pandas as pd # 构建示例DataFrame df = pd.DataFrame({ 'Name': ['A', 'B', 'C', 'D', 'E'], 'Age range': ['5-12', '12-18', '11-14', '7-9', '17-22'] }) # 拆分年龄区间为起始和结束数值列 df[['start', 'end']] = df['Age range'].str.split('-', expand=True).astype(int) # 利用矩阵广播计算每个区间包含的区间数量 starts = df['start'].values[:, None] ends = df['end'].values[:, None] df['Count'] = ((starts <= df['start'].values) & (ends >= df['end'].values)).sum(axis=1) # 整理为期望的输出格式 result = df[['Age range', 'Count']] print(result)
代码说明
str.split('-', expand=True):将Age range列按-拆分,生成起始值和结束值两列。- 矩阵广播:
starts <= df['start'].values生成5×5的布尔矩阵,每个元素表示当前区间起始值是否小于等于对应目标区间的起始值;ends >= df['end'].values同理生成结束值的比较矩阵。 - 两个布尔矩阵取逻辑与后,每行求和得到当前区间能完全包含的区间总数(包含自身)。
运行结果
| Age range | Count |
|---|---|
| 5-12 | 2 |
| 12-18 | 1 |
| 11-14 | 1 |
| 7-9 | 1 |
| 17-22 | 1 |
注:若期望结果中12-18的Count为2,可能是对“完全包含”的定义存在差异(比如允许端点重叠或部分覆盖),可根据实际需求调整比较条件,例如修改<=为<、>=为>,或调整重叠判断逻辑。
内容的提问来源于stack exchange,提问作者hhp
相关产品推荐
相关产品推荐

