如何在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
相关产品推荐
相关产品推荐

