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

Pandas groupby不合并非连续同组数据的实现方法咨询

如何在Pandas中实现连续同组统计

嘿,这个问题我之前在处理时序类连续分组数据时也遇到过!默认的Pandas groupby是全局分组——不管行的顺序,只要值相同就归为一组,这显然不是你想要的连续同组统计效果。咱们来一步步解决它:

第一步:先清理数据(关键!)

你提供的原始数据里,逗号后面带了空格,直接读入后country列会包含多余的空格(比如' USA'而不是'USA'),这会导致分组出错。所以首先要清理列中的空格:

from io import StringIO
import pandas as pd

myst="""india, 905034 , 19:44
USA, 905094 , 19:33
Russia, 905154 , 21:56
USA, 345345, 45:55
USA, 34535, 65:45"""
u_cols=['country', 'index', 'current_tm']
df = pd.read_csv(StringIO(myst), sep=',', names=u_cols)

# 清理各列的多余空格
for col in u_cols:
    df[col] = df[col].str.strip()

第二步:生成连续分组的标识

核心思路是:给连续相同的country行打上同一个分组ID。我们可以用ne()(不等于)判断当前行和上一行的country是否不同,再用cumsum()累加得到分组ID:

# 创建连续分组标识:连续相同country的行拥有相同group_id
df['group_id'] = df['country'].ne(df['country'].shift()).cumsum()

解释一下:

  • df['country'].shift()会把上一行的country值移到当前行
  • ne()比较当前行和上一行的country,不同则返回True(等价于1),相同则返回False(等价于0)
  • cumsum()累加这些值,这样连续相同的country就会被分到同一个group_id里

第三步:按连续分组统计

现在用country和group_id一起分组,就能得到连续同组的统计结果了:

# 按country和group_id分组,统计每组的行数
continuous_count = df.groupby(['country', 'group_id'], sort=False).size()

# 去掉group_id索引,得到你想要的格式
continuous_count = continuous_count.reset_index(level='group_id', drop=True)

print(continuous_count)

运行后输出就是你期望的结果:

country
india    1
USA      1
Russia   1
USA      2
dtype: int64

为什么默认groupby不行?

默认的df.groupby('country', sort=False).size()会把所有country为USA的行归为一组,不管它们是否连续。而我们通过group_id把不连续的USA分成了两个独立的组,这样统计出来的就是连续段的数量了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:00:00