如何按指定分箱数量对有序DataFrame进行分组聚合?
按行位置分箱并对Pandas DataFrame类别值求和
问题描述
我有一个如下结构的Pandas DataFrame:
| year | count_yes | count_no |
|---|---|---|
| 1900 | 5 | 7 |
| 1903 | 5 | 3 |
| 1915 | 14 | 6 |
| 1919 | 6 | 14 |
我希望不受year列具体数值影响,将数据分为2个分箱:前两行归为一组,后两行归为另一组,对每组内的count_yes和count_no求和,得到如下结果:
| year | count_yes | count_no |
|---|---|---|
| 1900 | 10 | 10 |
| 1910 | 20 | 20 |
之后我会用处理后的数据生成堆叠百分比柱状图,已写好绘图函数,只需调整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
相关产品推荐
相关产品推荐

