适配新增分类列的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)
关键修改说明
- 封装分组逻辑为函数:把原代码中生成
group的逻辑打包成process_category_group函数,这样可以对每个分类的子数据集单独执行。 - 按分类分组处理:使用
groupby('Cat').apply(...)遍历每个分类,确保每个分类的分组计数是独立的(从1开始),不会和其他分类的编号连续。 - 保持输出整洁:
group_keys=False参数避免在结果中额外添加分组索引,让输出格式和你期望的完全一致。
运行这段代码后,你会得到和示例中完全相同的输出:每个Cat的group从1到6依次编号,各自独立。
内容的提问来源于stack exchange,提问作者Fcoatis
相关产品推荐
相关产品推荐

