如何使用Pandas筛选DataFrame指定列包含特定字符串的行并返回结果
问题原因
- 字符串匹配逻辑错误:
if "FIFA" in df['tournament']是判断「FIFA」是否为tournament列的索引值,不是判断列内容中是否包含FIFA字符串,完全不符合筛选需求。 - 业务逻辑偏差:原有代码最终计算的是单场总进球最高的场次,和你要实现的「统计单个国家在FIFA赛事中累计总进球」的需求不符。
- 日期格式参数错误:
pd.to_datetime里的格式符填写错误,%M代表分钟,%D是%m/%d/%y的缩写,如果你原始数据的日期是「年/月/日」格式,需要替换为%Y/%m/%d。
修复后的代码
import pandas as pd import numpy as np filename = "results.csv" df = pd.read_csv(filename) # 修正日期转换格式,若原始日期为横杠分隔可将/替换为- df['date'] = pd.to_datetime(df['date'], format='%Y/%m/%d') # 先筛选2010年之后、赛事名称包含FIFA的数据集,case=False表示忽略大小写匹配 sub_df = df[(df['date'].dt.year >= 2010) & (df['tournament'].str.contains('FIFA', case=False))] if len(sub_df) == 0: print("no results") else: # 分别统计主客场的进球数,合并计算每个国家的累计总进球 home_goals = sub_df.groupby('home_team')['home_score'].sum().reset_index(name='goals') away_goals = sub_df.groupby('away_team')['away_score'].sum().reset_index(name='goals') total_goals = pd.concat([home_goals, away_goals]).groupby('home_team')['goals'].sum().reset_index() total_goals.columns = ['country', 'total_goals'] # 输出总进球最多的国家 max_goal_country = total_goals[total_goals['total_goals'] == total_goals['total_goals'].max()] print(max_goal_country)
补充说明
如果不需要统计国家累计进球,只需要找单场总进球最高的FIFA赛事场次,可以把else分支里的统计代码替换为:
# 计算单场总进球,筛选最高值对应的场次 sub_df['total_score'] = sub_df['home_score'] + sub_df['away_score'] max_match = sub_df[sub_df['total_score'] == sub_df['total_score'].max()] print(max_match)
内容的提问来源于stack exchange,提问作者user3042226
相关产品推荐
相关产品推荐

