
本文介绍如何使用pandas清洗《幸存者》选手数据,通过去重同一选手在同季多次出现的记录,再统计真实参演季数,从而精准识别参演季数最多的选手。
本文介绍如何使用pandas清洗《幸存者》选手数据,通过去重同一选手在同季多次出现的记录,再统计真实参演季数,从而精准识别参演季数最多的选手。
在分析《幸存者》(Survivor)这类真人秀节目的选手参与频次时,一个常见但关键的陷阱是:同一选手可能因剪辑、返场或制作调整等原因,在单季数据中被重复记录多次(例如同一季出现3次),但这并不等价于参与了3季。因此,统计“最常出现选手”必须基于唯一(选手ID, 赛季名)组合,而非原始行数。
核心思路分三步:
- 去重:先消除同一选手在同季的冗余记录;
- 聚合:按选手维度统计其参与的不同赛季数量;
- 排序取顶:找出参演季数最多的选手。
以下为完整实现流程(假设你有两个DataFrame:castaways含赛季与选手ID映射,castaway_details含选手基础信息):
import pandas as pd
# 步骤1:构建唯一参赛记录 —— 去除同一选手在同季的重复项
# 假设 castaways 包含列:'castaway_id', 'season_name'(或'season_number')
unique_appearances = castaways.drop_duplicates(
subset=['castaway_id', 'season_name'], # 关键:按选手+赛季联合去重
keep='first' # 保留首次出现记录(也可用'last',语义一致)
).copy()
# 步骤2:统计每位选手参与的独立季数
contestant_season_count = unique_appearances.groupby('castaway_id').size().reset_index(name='seasons_count')
# 步骤3:关联选手详细信息并获取TOP 1
result = contestant_season_count.merge(
castaway_details[['castaway_id', 'full_name', 'gender']],
on='castaway_id',
how='left'
).sort_values('seasons_count', ascending=False).head(1)
print("最常出现的选手:")
print(result[['full_name', 'seasons_count', 'gender']].to_dict('records')[0])✅ 关键注意事项:
- ❌ 不要直接对原始 castaways['castaway_id'] 调用 .value_counts() —— 这会把同季重复计为多季;
- ✅ 必须先用 drop_duplicates(subset=['castaway_id', 'season_name']) 锚定“真实参赛事件”;
- ? 若season_name存在格式不一致(如 "Survivor: Pearl Islands" vs "Pearl Islands"),建议标准化后再去重;
- ⚠️ 若需处理跨季重赛选手(如第1季和第20季都参加),本方法天然支持——只要castaway_id唯一且season_name准确,即可正确累计。
最终,你将得到一位参与独立赛季数最多的选手,结果兼具准确性与可复现性,适用于数据报告、可视化或后续建模分析。










