You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按指定分箱数量对有序DataFrame进行分组聚合?

按行位置分箱并对Pandas DataFrame类别值求和

问题描述

我有一个如下结构的Pandas DataFrame:

yearcount_yescount_no
190057
190353
1915146
1919614

我希望不受year列具体数值影响,将数据分为2个分箱:前两行归为一组,后两行归为另一组,对每组内的count_yes和count_no求和,得到如下结果:

yearcount_yescount_no
19001010
19102020

之后我会用处理后的数据生成堆叠百分比柱状图,已写好绘图函数,只需调整DataFrame结构即可。


解决方案

这里有两种简单的方法可以实现你的需求,完全不依赖year的数值,直接按行位置分组求和:

方法1:手动分配分组标签(适合固定行数的场景)

如果你的数据行数固定(比如就是4行),可以直接给前两行和后两行分别分配分组标签,再分组求和:

import pandas as pd

# 初始化原始DataFrame
df = pd.DataFrame({
    'year': [1900, 1903, 1915, 1919],
    'count_yes': [5, 5, 14, 6],
    'count_no': [7, 3, 6, 14]
})

# 给每行分配分组标签:前两行标记为"1900",后两行标记为"1910"
df['group'] = ['1900'] * 2 + ['1910'] * 2

# 按分组求和,并重命名列
result_df = df.groupby('group')[['count_yes', 'count_no']].sum().reset_index()
result_df = result_df.rename(columns={'group': 'year'})

print(result_df)

运行后输出的结果完全符合你的预期:

year  count_yes  count_no
0  1900         10        10
1  1910         20        20

方法2:动态分箱(适合行数较多的场景)

如果你的数据行数不固定,需要自动分成等数量的N个组,可以用pd.cut对行索引进行分箱,这种方法更灵活:

import pandas as pd

df = pd.DataFrame({
    'year': [1900, 1903, 1915, 1919],
    'count_yes': [5, 5, 14, 6],
    'count_no': [7, 3, 6, 14]
})

# 将行索引分成2个等数量的组,自定义分组标签
df['group'] = pd.cut(df.index, bins=2, labels=['1900', '1910'])

# 分组求和并调整结构
result_df = df.groupby('group')[['count_yes', 'count_no']].sum().reset_index().rename(columns={'group': 'year'})

这种方法会自动将数据平均分成指定数量的组,不需要手动计算行数,适合数据量较大的场景。

可视化验证

处理后的每组中count_yes和count_no的总和相等,所以堆叠后各自的占比都是50%,完全满足你生成堆叠百分比柱状图的需求。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 12:37:31