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

如何在Pandas DataFrame中按值分组?以拆分以‘go’动作起始的分组为例

实现按'go'起始拆分DataFrame的几种Pandas方法

嘿,这个需求其实在Pandas里有几种很实用的方法,我来给你详细讲讲,针对你的示例数据,最终都能得到2个符合要求的分组:

方法一:利用cumsum()生成分组键(最直观高效)

这是日常开发里最常用的方案,核心思路是给每个"以go开头"的分组生成唯一标识ID,再按ID分组即可:

import pandas as pd

# 构造示例数据
df = pd.DataFrame({
    'id': [1,1,1,1,1,1],
    'action': ['go','click','search','search','go','click'],
    'value': [3,0,0,0,3,0]
})

# 生成分组标识:每当action是'go'时,累加计数
df['group_id'] = (df['action'] == 'go').cumsum()

# 按group_id拆分得到分组列表
groups = [group for _, group in df.groupby('group_id')]

# 查看结果(可去掉临时的group_id列)
for idx, group in enumerate(groups, 1):
    print(f"--- 分组{idx} ---")
    print(group.drop('group_id', axis=1))

原理说明:

df['action'] == 'go'会生成布尔序列,cumsum()会把True当作1、False当作0累加。每遇到一行action='go',group_id就加1,后续行都会继承这个ID,直到下一个go出现,完美实现"以go为起始"的分组逻辑。

方法二:利用numpy.split()按索引拆分

如果你更倾向于直接按行索引拆分,可以先定位所有go的位置,再拆分DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'id': [1,1,1,1,1,1],
    'action': ['go','click','search','search','go','click'],
    'value': [3,0,0,0,3,0]
})

# 获取所有action='go'的行索引
go_positions = df[df['action'] == 'go'].index.tolist()

# 构造拆分边界:从第二个go的索引开始,到最后一行的下一个位置
split_borders = go_positions[1:] + [len(df)]

# 拆分DataFrame
groups = np.split(df, split_borders)

# 查看结果
for idx, group in enumerate(groups, 1):
    print(f"--- 分组{idx} ---")
    print(group)

原理说明:

np.split()需要传入拆分的索引位置,我们把第二个go的索引和DataFrame长度作为拆分点,就能把原数据拆分成"从第一个go到第二个go前"、"从第二个go到末尾"两个分组。

方法三:迭代器分组(适合自定义逻辑场景)

如果需要更灵活的分组逻辑,可以用itertools.groupby配合自定义分组键,不过这个方法相对繁琐:

import pandas as pd
from itertools import groupby

df = pd.DataFrame({
    'id': [1,1,1,1,1,1],
    'action': ['go','click','search','search','go','click'],
    'value': [3,0,0,0,3,0]
})

# 手动生成分组键序列
current_group = 0
group_keys = []
for action in df['action']:
    if action == 'go':
        current_group += 1
    group_keys.append(current_group)

# 用groupby分组并转换为DataFrame列表
groups = []
for key, group_data in groupby(df.itertuples(index=False), key=lambda x: group_keys[df.index.get_loc(x[0])]):
    groups.append(pd.DataFrame(group_data, columns=df.columns))

# 查看结果
for idx, group in enumerate(groups, 1):
    print(f"--- 分组{idx} ---")
    print(group)

原理说明:

手动遍历action列,每遇到go就切换分组ID,再用groupby按这个ID分组,最后把分组数据转回DataFrame。这种方法适合需要在分组时加入额外判断逻辑的场景。

以上几种方法都能满足需求,其中方法一因为简洁高效,是日常开发的首选。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:02:28