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

适配新增分类列的Pandas Groupby分组代码改造问询

解决方案

要让每个分类(Cat)独立生成分组编号,我们需要把原来的分组逻辑按分类单独执行,而不是全局处理。这样每个分类的group都会从1开始重新计数,完全符合你想要的输出格式。

完整实现代码

import pandas as pd

# 准备基础数据
data = {'date': ['2017-03-31', '2017-04-03', '2017-12-27', '2017-12-28', '2017-12-29', '2018-01-02', '2018-12-31', '2019-01-02', '2019-01-03', '2019-12-31', '2020-12-30', '2020-12-31', '2021-01-20', '2021-12-30', '2021-12-31', '2022-05-30', '2022-05-31'], 
        'value': [1163.00, 1221.15, 1318.84, 1384.78, 1523.26, 1660.36, 1710.17, 1881.18, 1956.43, 2015.12, 2216.64, 2349.63, 2373.13, 2562.98, 2819.28, 2875.66, 2904.42 ] }
df1 = pd.DataFrame(data)

# 构造多分类数据集(模拟实际场景的多分类结构)
df2 = pd.DataFrame({'Cat': ['Cat1', 'Cat2']})
df3 = pd.merge(df2.assign(key=1), df1.assign(key=1), on='key').drop('key', axis=1)

# 定义单个分类的分组处理函数
def process_category_group(sub_df):
    # 转换日期格式
    d = pd.to_datetime(sub_df['date'])
    # 标记需要重复的年末行
    dup = d.dt.year.ne(d.shift().dt.year).shift(-1, fill_value=False).add(1)
    # 重复指定行
    sub_df = sub_df.reindex(sub_df.index.repeat(dup))
    # 生成组编号
    gid = sub_df.index.duplicated(keep='first').cumsum() + 1
    return sub_df.assign(group=gid).reset_index(drop=True)

# 按分类分组应用函数,合并结果
final_df = df3.groupby('Cat', group_keys=False).apply(process_category_group).reset_index(drop=True)

# 打印结果验证
print(final_df)

关键修改说明

  1. 封装分组逻辑为函数:把原代码中生成group的逻辑打包成process_category_group函数,这样可以对每个分类的子数据集单独执行。
  2. 按分类分组处理:使用groupby('Cat').apply(...)遍历每个分类,确保每个分类的分组计数是独立的(从1开始),不会和其他分类的编号连续。
  3. 保持输出整洁:group_keys=False参数避免在结果中额外添加分组索引,让输出格式和你期望的完全一致。

运行这段代码后,你会得到和示例中完全相同的输出:每个Cat的group从1到6依次编号,各自独立。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 01:17:28