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

Pandas实现带标签的累计计数:生成Package列的方法问询

解决Pandas DataFrame生成自定义Package列的问题

需求分析

需要新增Package列,规则为:

  • 每个唯一的(Cluster, Country, Publishers)组合对应一个递增的基础数字(从1开始)
  • 同一组合内,第一个Assets行的Package为基础数字,第二个为数字+a,第三个为数字+b,依此类推

实现代码

首先构造示例DataFrame(如果已有数据可跳过此步):

import pandas as pd

data = {
    'Cluster': ['South']*11,
    'Country': ['IT']*9 + ['ES']*2,
    'Publishers': ['SS']*3 + ['ML']*3 + ['TT']*3 + ['SS']*2,
    'Assets': ['Asset1','Asset2','Asset3']*3 + ['Asset1','Asset2']
}
df = pd.DataFrame(data)

生成Package列的核心代码:

# 为每个(Cluster, Country, Publishers)组分配全局递增的基础编号(从1开始)
df['base_num'] = df.groupby(['Cluster', 'Country', 'Publishers']).ngroup() + 1

# 生成组内后缀:第一个元素无后缀,后续按a、b、c...依次生成
df['suffix'] = df.groupby(['Cluster', 'Country', 'Publishers']).cumcount().apply(
    lambda x: chr(ord('a') + x - 1) if x > 0 else ''
)

# 拼接基础编号与后缀得到最终的Package列
df['Package'] = df['base_num'].astype(str) + df['suffix']

# 清理中间辅助列(可选)
df = df.drop(['base_num', 'suffix'], axis=1)

代码说明

  1. ngroup():为每个分组分配从0开始的序号,加1后得到从1开始的全局递增基础数字,确保不同的(Cluster, Country, Publishers)组合对应唯一的编号。
  2. 组内cumcount():获取每个组内的行索引(从0开始),通过apply将索引转换为对应的字母后缀:索引0(第一个行)无后缀,索引1对应a,索引2对应b,以此类推。
  3. 字符串拼接:将基础数字转为字符串后与后缀拼接,得到符合要求的Package格式。

验证结果

运行代码后,DataFrame将生成预期的Package列,与需求中的结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:35:20