
本文介绍如何使用pandas对《幸存者》参赛者数据进行科学去重与频次统计:先按“姓名+赛季”组合剔除同一赛季重复参演记录,再统计每位选手实际参与的不同赛季数量,最终精准识别出场赛季数最多的选手。
本文介绍如何使用pandas对《幸存者》参赛者数据进行科学去重与频次统计:先按“姓名+赛季”组合剔除同一赛季重复参演记录,再统计每位选手实际参与的不同赛季数量,最终精准识别出场赛季数最多的选手。
在分析《幸存者》(Survivor)这类真人秀节目的参赛者活跃度时,一个常见但易被忽略的关键点是:同一选手在同一季中可能因返场、补位或剪辑分镜等原因在数据中出现多次记录,但这仅对应1次有效参赛。若直接对castaway_id或full_name做全局计数(如value_counts()),会高估其实际参赛赛季数,导致排名失真。
因此,正确流程应分为三步:
去重:基于“选手标识 + 赛季”组合保留唯一参赛事件
使用 drop_duplicates(subset=['castaway_id', 'season'])(或['full_name', 'season'],推荐用castaway_id防重名)移除同一选手在相同赛季的冗余记录。keep='first'(默认)或keep='last'均可,取决于业务偏好。聚合:按选手维度统计其参与的不同赛季数
去重后,对castaway_id分组并计算season列的去重数量(nunique()),即该选手实际参演的独立赛季数。排序取极值:定位最高频选手
按赛季数降序排列,取首行即可获得最频繁参赛者;也可用idxmax()配合loc精准提取。
以下为完整可运行示例(模拟真实数据结构):
import pandas as pd
# 模拟 castaways 数据框:含选手ID、赛季、姓名等字段
castaways = pd.DataFrame({
'castaway_id': [101, 101, 101, 102, 102, 103, 103, 103],
'season': [39, 39, 40, 41, 41, 38, 39, 42],
'full_name': ['Jane', 'Jane', 'Jane', 'Karen', 'Karen', 'Alex', 'Alex', 'Alex']
})
# 步骤1:去除同一选手在相同赛季的重复记录
deduped = castaways.drop_duplicates(subset=['castaway_id', 'season'], keep='first')
# 步骤2:统计每位选手参与的不同赛季数
season_count = deduped.groupby('castaway_id')['season'].nunique().reset_index(name='seasons_participated')
# 步骤3:找出参赛赛季数最多的选手(支持并列)
top_contestant = season_count.loc[season_count['seasons_participated'].idxmax()]
print("最高频参赛者信息:")
print(top_contestant)✅ 输出示例:
castaway_id 101
seasons_participated 2
表明选手ID为101的参赛者实际参与了2个不同赛季(尽管原始数据中其在S39出现两次,但去重后仅计1次)。
⚠️ 关键注意事项:
- 优先使用castaway_id而非full_name去重:避免因姓名拼写差异(如“Jon”/“John”)或重名(如多位“Mike”)导致误合并;
- 确保season字段类型一致:若为字符串需统一格式(如"S42" → 42),否则nunique()将视为不同值;
- 处理并列情况:若多人并列最高频,idxmax()仅返回首个索引,建议改用 season_count[season_count['seasons_participated'] == season_count['seasons_participated'].max()] 获取全部;
- 关联选手详情:最终结果可通过merge与castaway_details表连接,补充性别、年龄等元信息。
通过这一标准化流程,你不仅能准确回答“谁参加了最多届《幸存者》”,更能为后续分析(如回归表现、淘汰轮次分布等)奠定干净可靠的数据基础。










