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

如何在Python/Pandas中按连续相同值聚合DataFrame并执行统计操作

Pandas按连续相同值分组聚合的实现

我需要对pandas DataFrame按连续相同值分组,执行计数、取最大值等聚合操作,要求组内所有元素显示相同的聚合结果。

示例场景

单列计数场景

原DataFrame:

import pandas as pd

df_single = pd.DataFrame({
    'my_column': [0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0]
})

期望结果:每个连续相同值的组,所有元素显示该组的元素个数

my_column  result
0           0       2
1           0       2
2           1       3
3           1       3
4           1       3
5           0       4
6           0       4
7           0       4
8           0       4
9           1       2
10          1       2
11          0       1

多列取最大值场景

原DataFrame:

df_multi = pd.DataFrame({
    'my_column': [0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0],
    'other_value': [7, 4, 1, 0, 5, 1, 1, 2, 8, 1, 0, 2]
})

期望结果:按my_column的连续相同值分组,取other_value的最大值并广播到组内所有元素

my_column  other_value  result
0           0            7       7
1           0            4       7
2           1            1       5
3           1            0       5
4           1            5       5
5           0            1       8
6           0            1       8
7           0            2       8
8           0            8       8
9           1            1       1
10          1            0       1
11          0            2       2

解决方案

核心思路:先生成连续相同值的分组标签,再通过分组标签计算聚合结果,最后将结果映射回原DataFrame。

步骤1:生成连续分组标签

通过比较当前行与前一行的值是否不同,生成递增的分组标识:

# 单列场景生成分组标签
group_labels = (df_single['my_column'] != df_single['my_column'].shift()).cumsum()

# 多列场景,基于my_column生成分组标签
group_labels_multi = (df_multi['my_column'] != df_multi['my_column'].shift()).cumsum()

步骤2:执行聚合并映射回原数据

场景1:分组计数

计算每个组的元素个数,再通过map将结果赋值给原DataFrame:

# 计算每个组的大小并按索引排序
group_counts = group_labels.value_counts().sort_index()
# 映射到原数据生成result列
df_single['result'] = group_labels.map(group_counts)

场景2:分组取最大值

按分组标签对目标列取最大值,再映射回原数据:

# 按分组标签取other_value的最大值
group_max = df_multi.groupby(group_labels_multi)['other_value'].max()
# 映射到原数据生成result列
df_multi['result'] = group_labels_multi.map(group_max)

完整可运行代码

import pandas as pd

# 单列计数示例
df_single = pd.DataFrame({
    'my_column': [0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0]
})
group_labels = (df_single['my_column'] != df_single['my_column'].shift()).cumsum()
group_counts = group_labels.value_counts().sort_index()
df_single['result'] = group_labels.map(group_counts)
print("单列计数结果:")
print(df_single)

# 多列取最大值示例
df_multi = pd.DataFrame({
    'my_column': [0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0],
    'other_value': [7, 4, 1, 0, 5, 1, 1, 2, 8, 1, 0, 2]
})
group_labels_multi = (df_multi['my_column'] != df_multi['my_column'].shift()).cumsum()
group_max = df_multi.groupby(group_labels_multi)['other_value'].max()
df_multi['result'] = group_labels_multi.map(group_max)
print("\n多列取最大值结果:")
print(df_multi)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:30:03