Pandas DataFrame重分箱:合并粗区间并求和计数及方差列
Pandas 重分箱并聚合区间数据解决方案
我来帮你搞定这个分箱聚合的需求!针对你需要将现有DataFrame按指定新区间重分箱,并对n和v求和的需求,这里提供一个灵活适配非规整数据的实现方案:
核心思路
- 定义目标分箱的边界与对应左标签
- 将原数据的
E值匹配到目标分箱区间 - 按目标区间分组对
n和v求和 - 确保所有目标区间都存在(即使原数据缺失对应行)
代码实现
1. 导入依赖并构造示例数据
import pandas as pd # 示例输入数据(你可以替换成自己的DataFrame) df = pd.DataFrame({ 'E': [200.0, 300.0, 400.0, 500.0, 600.0, 800.0, 900.0, 1000.0, 1100.0], 'n': [26.0, 56.0, 62.0, 55.0, 24.0, 12.0, 8.0, 4.0, 1.0], 'v': [1.3, 2.2, 2.5, 2.2, 1.7, 1.3, 0.9, 0.6, 0.2] })
2. 定义目标分箱规则
# 目标分箱边界:[200,300), [300,400), [400,600), [600,1000), [1000, +∞) target_bins = [200, 300, 400, 600, 1000, float('inf')] # 对应区间的左边界标签(即输出的E列值) target_labels = [200.0, 300.0, 400.0, 600.0, 1000.0]
3. 匹配分箱并聚合求和
# 将原数据的E值映射到目标分箱的左标签(right=False表示左闭右开区间) df['target_E'] = pd.cut(df['E'], bins=target_bins, labels=target_labels, right=False) # 按目标标签分组,对n和v求和 aggregated = df.groupby('target_E')[['n', 'v']].sum().reset_index() # 重命名列名以匹配期望输出 aggregated.rename(columns={'target_E': 'E'}, inplace=True)
4. 适配非规整数据(补全缺失区间)
如果你的原DataFrame可能缺失某些区间的行,我们可以构造一个包含所有目标区间的基准DataFrame,通过合并确保结果完整性:
# 构造包含所有目标区间的基准表 base_df = pd.DataFrame({'E': target_labels}) # 左合并基准表与聚合结果,缺失值填充为0(可根据业务调整) final_result = base_df.merge(aggregated, on='E', how='left').fillna(0)
输出结果
运行上述代码后,final_result就是你需要的格式:
E n v 0 200.0 26.0 1.3 1 300.0 56.0 2.2 2 400.0 117.0 4.7 3 600.0 44.0 3.9 4 1000.0 5.0 0.8
关键说明
pd.cut的right=False参数确保区间逻辑和你原数据的左边界定义一致(比如E=500会被分到[400,600)区间,对应标签400)- 合并基准表的步骤可以保证即使原数据没有某个区间的数据,结果中也会保留该区间,且
n和v为0(可根据需求修改填充值)
内容的提问来源于stack exchange,提问作者GluonicPenguin
相关产品推荐
相关产品推荐

