
本文介绍如何使用pandas对《幸存者》选手参赛记录进行科学去重与频次统计:先按“姓名+赛季”组合剔除同一选手在单季内重复入场的情况,再统计每位选手实际参与的不同赛季数,最终精准识别参赛频次最高的选手。
本文介绍如何使用pandas对《幸存者》选手参赛记录进行科学去重与频次统计:先按“姓名+赛季”组合剔除同一选手在单季内重复入场的情况,再统计每位选手实际参与的不同赛季数,最终精准识别参赛频次最高的选手。
在分析《幸存者》(Survivor)这类真人秀的选手参与数据时,一个常见但易被忽略的关键点是:同一选手可能因规则(如重返、复活、双人回归等)在单季中被多次记录(例如初选、重赛、替补入场),但这仅算作1次有效参赛。若直接对castaway_id或full_name做全局计数(如.value_counts().idxmax()),会高估真实参赛频次,导致结果失真。
正确做法是:先基于“选手标识 + 赛季标识”去重,确保每位选手在每个赛季最多只计1次;再按选手聚合统计其参与的不同赛季数量。以下是完整实现流程:
✅ 步骤一:构造唯一参赛单元并去重
假设你有两个核心DataFrame:
- castaways:含castaway_id、season_name(或season_number)、full_name等字段;
- castaway_details:含castaway_id、full_name、gender等基础信息。
首先,合并或对齐关键字段,构建去重依据:
# 确保 castaways 中有 season_name 和 castaway_id(或 full_name) # 若需关联 castaway_details,可先 merge 获取完整信息 df = castaways[['castaway_id', 'season_name', 'full_name']].copy() # 关键:按 (castaway_id, season_name) 去重 —— 同一人同季只保留一条记录 df_dedup = df.drop_duplicates(subset=['castaway_id', 'season_name'], keep='first').reset_index(drop=True)
? 提示:使用keep='first'或'last'均可,二者语义一致,仅影响保留哪条原始记录;reset_index(drop=True)确保索引连续,便于后续操作。
✅ 步骤二:统计每位选手实际参与的赛季数
去重后,每位选手-赛季组合唯一,此时按选手聚合即可获得真实参赛季数:
# 按 castaway_id 统计不同 season_name 的数量(即参赛季数)
season_count = df_dedup.groupby('castaway_id')['season_name'].nunique().sort_values(ascending=False)
# 获取参赛次数最多的选手 ID
top_contestant_id = season_count.idxmax()
top_count = season_count.max()
print(f"参赛次数最多的选手 ID:{top_contestant_id},共参与 {top_count} 个不同赛季")✅ 步骤三:获取该选手的完整信息
通过castaway_details表关联详细资料:
# 假设 castaway_details 以 castaway_id 为主键 top_contestant_info = castaway_details[castaway_details['castaway_id'] == top_contestant_id].iloc[0] print(top_contestant_info[['full_name', 'gender', 'age_at_debut']]) # 根据实际字段调整
⚠️ 注意事项
- 避免仅用full_name去重:存在重名风险(如多季出现同名选手),强烈建议优先使用唯一标识符castaway_id;
- 赛季字段需标准化:确保season_name或season_number格式统一(如全部为字符串或整数),否则drop_duplicates可能失效;
- 不要跳过去重直接计数:原问题中castaways['castaway id'].value_counts().idxmax()错误根源正在于此——它统计的是记录行数,而非独立赛季数;
- 扩展分析建议:可进一步计算前5名选手、各性别分布、平均参赛间隔等,增强分析深度。
通过上述三步,你将得到真正反映选手“跨季活跃度”的权威统计结果,为节目策略分析、粉丝研究或数据可视化提供坚实基础。










