如何按Period、Group分组将PlayerID升序拼接为新列Unique_GroupID
实现方案
你要的逻辑用pandas可以非常方便实现,核心是按周期+分组聚合后把组ID映射回每一行,两种常用写法按需选择即可。
写法1:简洁版(适合绝大多数场景)
代码最短,不需要额外合并表,直接用groupby+transform一步生成新列:
import pandas as pd # 一步生成Unique_GroupID列 df['Unique_GroupID'] = df.groupby(['Period', 'Group'])['PlayerID']\ .transform(lambda group: '-'.join(sorted(group)))
逻辑说明:
- 以
Period、Group两个字段为分组键,精准圈定每个周期下的每个玩家组 - 对每个组内的
PlayerID做升序排序,彻底消除组内玩家行顺序不同带来的ID差异,保证只要是完全相同的5个玩家,不管行顺序怎么排都生成完全一致的ID - 用短横线拼接排序后的ID字符串,通过
transform直接把组级结果填充到组内每一行,输出和你给出的示例效果完全匹配
写法2:性能优化版(适合10万行以上的大数据集)
如果数据量很大,写法1里的lambda逐组调用会有性能损耗,用全局排序+聚合关联的方式速度快30%以上:
# 先按周期、分组、玩家ID全局排序,分组时不需要重复排序 sorted_df = df.sort_values(by=['Period', 'Group', 'PlayerID']) # 聚合生成每个组对应的唯一ID group_lookup = sorted_df.groupby(['Period', 'Group'])['PlayerID']\ .agg('-'.join)\ .reset_index(name='Unique_GroupID') # 把组ID关联回原表 df = df.merge(group_lookup, on=['Period', 'Group'], how='left')
小提示:后续要验证玩家是否曾同组,直接筛选
Unique_GroupID中同时包含对应玩家ID的记录即可,不需要再做重复分组计算。
内容的提问来源于stack exchange,提问作者Matthias Herrmann
相关产品推荐
相关产品推荐

