如何利用指定起止列表对Pandas DataFrame的Measure列分组?
Pandas按指定起止范围分组的实现方法
假设你的DataFrame名为df,包含取值0-100的Measure列,给定start_list = [1, 10, 20, 30]和end_list = [10, 20, 30, 40],以下是两种常见的分组方案:
方案一:不重叠区间分组(边界值仅归属一个组)
如果希望每个数值只属于一个分组(比如10仅归到10-20组,而非同时属于1-10和10-20),可以使用pd.cut()函数快速实现:
步骤1:构造分箱和标签
import pandas as pd # 组合分箱边界:起始列表 + 最后一个结束值 bins = start_list + [end_list[-1]] # 生成分组标签,格式如["1-10", "10-20", ...] group_labels = [f"{s}-{e}" for s, e in zip(start_list, end_list)]
步骤2:执行分组
根据你希望的边界归属调整参数:
- 若希望左闭右开(区间如
[1,10)、[10,20),即10归到下一个组):
df['Group'] = pd.cut(df['Measure'], bins=bins, labels=group_labels, right=False)
- 若希望左开右闭(区间如
(1,10]、(10,20],即10归到当前组),同时确保第一个区间包含起始值1:
df['Group'] = pd.cut(df['Measure'], bins=bins, labels=group_labels, include_lowest=True)
步骤3:按分组聚合(可选)
完成分组后,可以对各组做统计分析,比如计算每组的均值:
grouped_result = df.groupby('Group')['Measure'].mean()
方案二:重叠区间分组(边界值归属多个组)
如果需要让边界值(如10)同时属于对应的两个分组(1-10和10-20),可以通过自定义函数结合apply()实现:
步骤1:定义分组匹配函数
def get_groups(measure_val): groups = [] for s, e in zip(start_list, end_list): if s <= measure_val <= e: groups.append(f"{s}-{e}") return groups if groups else ['其他'] # 不在指定范围内的数值归为"其他"组
步骤2:生成分组列
df['Groups'] = df['Measure'].apply(get_groups)
步骤3:展开多分组数据(可选)
如果需要将每个分组的单独记录展开(方便后续聚合统计),可以使用explode():
expanded_df = df.explode('Groups') # 按展开后的分组统计数量 expanded_result = expanded_df.groupby('Groups')['Measure'].count()
内容的提问来源于stack exchange,提问作者Maj
相关产品推荐
相关产品推荐

