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

PowerQuery:统计分组聚合数据中的唯一实例数量

统计玩家为所属队伍的参赛次数(按场次去重)

我有一组游戏玩家事件数据,想统计每位玩家为所属队伍的参赛次数。现在用Group by分组时,会直接统计玩家列的行数(比如玩家单场比赛有3个事件就被计为3次),但实际单场参赛应该只算1次,不知道怎么分组时按场次统计玩家是否参赛,而不是事件数。

期望结果

队伍玩家参赛次数
AAAP13
AAAP22

注:P1在1/1、1/2、1/4参赛;P2仅在1/1、1/2参赛,未参加1/4

源数据

队伍日期玩家事件
AAA1/1/23P1Shoot
AAA1/1/23P2Miss
AAA1/1/23P1Pass
AAA1/1/23P3Score
AAA1/1/23P5Miss
AAA1/1/23P1Shoot
AAA1/2/23P6Shoot
AAA1/2/23P1Miss
AAA1/2/23P3Pass
AAA1/2/23P4Miss
AAA1/2/23P7Miss
AAA1/2/23P1Shoot
AAA1/4/23P1Score
AAA1/4/23P2Shoot
AAA1/4/23P4Miss
BBB1/1/23P1Miss
BBB1/1/23P3Miss
BBB1/1/23P1Pass
BBB1/1/23P6Score
BBB1/3/23P5Miss
BBB1/3/23P3Shoot
BBB1/3/23P2Shoot
BBB1/4/23P1Score
BBB1/4/23P3Pass

当前问题

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:31:43