DataFrame数据提取与统计:运动员排名统计表格优化需求
问题与解决方案
原始数据与需求
已有如下DataFrame:
import pandas as pd data = {'Eventname': ['100m','200m','Discus','100m','200m','Discus'], 'Year': [2030,2030,2031,2030,2031,2032], 'FirstPlace': ['John Smith', 'Shar jean', 'Abi whi', 'mik jon','joh doe', 'John Smith'], 'SecPlace': ['joh doe', 'John Smith', 'Shar jean', 'Hen Hun','Tom Will', 'Gord Jay'], 'thiPlace': ['mik jon', 'Lisa tru', 'John Smith', 'Bret Tun','Tim Smith', 'Jack Mann'] } df = pd.DataFrame(data)
需求:创建新DataFrame,第一列包含所有出现在FirstPlace、SecPlace、thiPlace中的不重复运动员姓名,后续列分别统计每个姓名在对应排名列中的出现次数。
原代码及问题
原编写代码:
NewArr=pd.DataFrame() NewArr['first']=df['FirstPlace'].value_counts() NewArr['second']=df['SecPlace'].value_counts() NewArr['third']=df['thiPlace'].value_counts()
存在问题:
- 仅显示
FirstPlace列中的姓名,遗漏了仅出现在SecPlace或thiPlace中的运动员 - 结果中存在
NaN值,需要替换为0 - 姓名列无标题,需添加“AthleteName”列名
修正后的代码
# 收集所有不重复的运动员姓名 all_athletes = pd.concat([df['FirstPlace'], df['SecPlace'], df['thiPlace']]).unique() # 构建新DataFrame并处理所有需求 new_df = pd.DataFrame({ 'first': df['FirstPlace'].value_counts(), 'second': df['SecPlace'].value_counts(), 'third': df['thiPlace'].value_counts() }).reindex(all_athletes, fill_value=0).reset_index().rename(columns={'index': 'AthleteName'})
代码说明
- 覆盖所有运动员:用
pd.concat合并三个排名列,再通过unique()提取所有不重复姓名,确保没有遗漏仅出现在第二、第三名的运动员 - 替换NaN为0:使用
reindex(all_athletes, fill_value=0),让每个排名的统计结果都对齐所有运动员,不存在的记录直接填充0 - 添加姓名列标题:通过
reset_index()把原索引转为普通列,再用rename将列名改为“AthleteName”
内容的提问来源于stack exchange,提问作者almegdadi
相关产品推荐
相关产品推荐

