
本文讲解如何使用pandas对《幸存者》选手参赛数据进行科学去重与频次统计:先按“选手id+赛季”组合去重,再统计每位选手实际参与的不同赛季数,从而精准识别真正出场次数最多的选手。
本文讲解如何使用pandas对《幸存者》选手参赛数据进行科学去重与频次统计:先按“选手id+赛季”组合去重,再统计每位选手实际参与的不同赛季数,从而精准识别真正出场次数最多的选手。
在分析《幸存者》(Survivor)这类真人秀的选手参演历史时,一个常见误区是直接对castaway_id做简单计数——这会错误地将同一选手在同一赛季中因剪辑、回归挑战或特殊规则而出现的多次记录计入总次数。例如某选手在S32中被重复录入3次,仅因镜头回放或花絮片段,并不表示其参加了3个不同赛季。因此,真实参赛频次应以「选手 × 独立赛季」为最小统计单元。
正确做法是:先基于castaway_id和season(或season_name)联合去重,再按castaway_id聚合计数。以下是完整实现流程:
✅ 步骤一:联合去重(关键!)
# 假设 castaways 是原始参赛记录表,含列:'castaway_id', 'season', 'season_name', 'full_name'
# 保留每组 (castaway_id, season) 的最后一条记录(也可用 keep='first')
deduped = castaways.drop_duplicates(
subset=['castaway_id', 'season'], # 注意:务必同时指定选手ID和赛季标识
keep='last'
).reset_index(drop=True)⚠️ 注意事项:
- season 列必须是能唯一标识一季的字段(推荐使用 season_name 如 'Survivor: Cambodia',避免仅用数字 32 可能存在的跨系列歧义);
- 若原始数据中存在缺失值(NaN),drop_duplicates 默认将其视为相等,建议提前清洗:deduped = castaways.dropna(subset=['castaway_id', 'season'])。
✅ 步骤二:统计各选手实际参与赛季数
# 统计每位选手在去重后数据中出现的次数(即真实参赛季数)
contestant_counts = deduped['castaway_id'].value_counts().reset_index(
name='seasons_participated'
)
contestant_counts.columns = ['castaway_id', 'seasons_participated']
# 关联选手基本信息(如姓名、性别)
result = contestant_counts.merge(
castaway_details[['castaway_id', 'full_name', 'gender']],
on='castaway_id',
how='left'
)
# 获取参赛次数最多的选手
top_contestant = result.nlargest(1, 'seasons_participated')
print(top_contestant[['full_name', 'seasons_participated', 'gender']])✅ 验证示例(模拟数据)
import pandas as pd
# 模拟原始 castaways 数据:jane 在 season 3 出现两次(应视为1次),karen 在 season 10 出现一次
df = pd.DataFrame([
['jane', 3], ['jane', 3], ['karen', 10]
], columns=['name', 'season'])
deduped = df.drop_duplicates(subset=['name', 'season'])
print("原始数据:\n", df)
print("\n去重后(按 name+season):\n", deduped)
print("\n各选手参赛季数:\n", deduped['name'].value_counts())输出:
原始数据: name season 0 jane 3 1 jane 3 2 karen 10 去重后(按 name+season): name season 1 jane 3 2 karen 10 各选手参赛季数: karen 1 jane 1 dtype: int64
? 总结
- ❌ 错误:castaways['castaway_id'].value_counts() → 忽略赛季维度,高估频次;
- ✅ 正确:drop_duplicates(subset=['castaway_id', 'season']) + value_counts() → 精准反映「独立赛季参与数」;
- ? 进阶建议:可进一步按full_name模糊匹配合并别名(如 "Rob Mariano" / "Rob M."),并添加season_year字段辅助时间序列分析。
此方法不仅适用于《幸存者》,也广泛适用于任何需规避「同一主体在相同业务周期内重复记录」的频次统计场景。










