PowerQuery:统计分组聚合数据中的唯一实例数量
统计玩家为所属队伍的参赛次数(按场次去重)
我有一组游戏玩家事件数据,想统计每位玩家为所属队伍的参赛次数。现在用Group by分组时,会直接统计玩家列的行数(比如玩家单场比赛有3个事件就被计为3次),但实际单场参赛应该只算1次,不知道怎么分组时按场次统计玩家是否参赛,而不是事件数。
期望结果
| 队伍 | 玩家 | 参赛次数 |
|---|---|---|
| AAA | P1 | 3 |
| AAA | P2 | 2 |
注:P1在1/1、1/2、1/4参赛;P2仅在1/1、1/2参赛,未参加1/4
源数据
| 队伍 | 日期 | 玩家 | 事件 |
|---|---|---|---|
| AAA | 1/1/23 | P1 | Shoot |
| AAA | 1/1/23 | P2 | Miss |
| AAA | 1/1/23 | P1 | Pass |
| AAA | 1/1/23 | P3 | Score |
| AAA | 1/1/23 | P5 | Miss |
| AAA | 1/1/23 | P1 | Shoot |
| AAA | 1/2/23 | P6 | Shoot |
| AAA | 1/2/23 | P1 | Miss |
| AAA | 1/2/23 | P3 | Pass |
| AAA | 1/2/23 | P4 | Miss |
| AAA | 1/2/23 | P7 | Miss |
| AAA | 1/2/23 | P1 | Shoot |
| AAA | 1/4/23 | P1 | Score |
| AAA | 1/4/23 | P2 | Shoot |
| AAA | 1/4/23 | P4 | Miss |
| BBB | 1/1/23 | P1 | Miss |
| BBB | 1/1/23 | P3 | Miss |
| BBB | 1/1/23 | P1 | Pass |
| BBB | 1/1/23 | P6 | Score |
| BBB | 1/3/23 | P5 | Miss |
| BBB | 1/3/23 | P3 | Shoot |
| BBB | 1/3/23 | P2 | Shoot |
| BBB | 1/4/23 | P1 | Score |
| BBB | 1/4/23 | P3 | Pass |
当前问题
使用Group by会统计行数,而非按场次去重后的唯一参赛次数。
解决方案
1. SQL 实现
核心思路是先按队伍、玩家、日期去重,得到每个玩家每场比赛的唯一记录,再按队伍和玩家分组统计次数。
SELECT 队伍, 玩家, COUNT(DISTINCT 日期) AS 参赛次数 FROM 游戏事件表 GROUP BY 队伍, 玩家 ORDER BY 队伍, 玩家;
或者先生成去重后的临时表再统计,逻辑更清晰:
WITH 去重参赛记录 AS ( SELECT DISTINCT 队伍, 玩家, 日期 FROM 游戏事件表 ) SELECT 队伍, 玩家, COUNT(日期) AS 参赛次数 FROM 去重参赛记录 GROUP BY 队伍, 玩家 ORDER BY 队伍, 玩家;
2. Python Pandas 实现
两种方式都能实现,效果一致:
方式一:先去重再统计
import pandas as pd # 假设数据已存入DataFrame df df = pd.read_csv('你的数据文件路径.csv') # 保留每个玩家每场比赛的唯一记录 unique_records = df[['队伍', '玩家', '日期']].drop_duplicates() # 分组统计参赛次数 result = unique_records.groupby(['队伍', '玩家']).size().reset_index(name='参赛次数') print(result)
方式二:直接用nunique统计分组内的唯一日期数
import pandas as pd df = pd.read_csv('你的数据文件路径.csv') result = df.groupby(['队伍', '玩家'])['日期'].nunique().reset_index(name='参赛次数') print(result)
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

