如何基于主客场排名差异使用多条件语句计算进球乘数?
解决方案:根据排名差异计算加权进球数
首先需要明确:你的需求描述和示例存在逻辑矛盾:
- 需求中规定「己方排名高于对手时,进球数×0.45」
- 但示例里,Ducks(主队,排名1)高于Frogs(客队,排名2),却要求执行「home_goals×0.15」
下面分两种情况给出实现方案:
情况1:严格遵循需求描述的规则
规则:
- 己方排名低于对手(己方rank数字 > 对手rank数字):进球数×0.15
- 双方排名持平:进球数×0.30
- 己方排名高于对手(己方rank数字 < 对手rank数字):进球数×0.45
用Python Pandas批量处理示例数据的代码:
import pandas as pd import numpy as np # 构造示例数据 df = pd.DataFrame({ 'home_team': ['Ducks', 'Frogs', 'Eagles'], 'away_team': ['Frogs', 'Eagles', 'Ducks'], 'rank_home': [1, 3, 2], 'rank_away': [2, 3, 1], 'home_goals': [4, 6, 5], 'away_goals': [1, 3, 5] }) # 计算主队加权进球 df['weighted_home'] = np.select( [ df['rank_home'] > df['rank_away'], # 主队排名低于客队 df['rank_home'] == df['rank_away'], # 排名持平 df['rank_home'] < df['rank_away'] # 主队排名高于客队 ], [ df['home_goals'] * 0.15, df['home_goals'] * 0.30, df['home_goals'] * 0.45 ] ) # 计算客队加权进球 df['weighted_away'] = np.select( [ df['rank_away'] > df['rank_home'], # 客队排名低于主队 df['rank_away'] == df['rank_home'], # 排名持平 df['rank_away'] < df['rank_home'] # 客队排名高于主队 ], [ df['away_goals'] * 0.15, df['away_goals'] * 0.30, df['away_goals'] * 0.45 ] ) print(df)
运行结果中,索引0的Ducks加权进球为 4×0.45=1.8,符合需求描述的规则。
情况2:严格遵循示例的操作逻辑
规则(根据示例推导):
- 己方排名高于对手(己方rank数字 < 对手rank数字):进球数×0.15
- 双方排名持平:进球数×0.30
- 己方排名低于对手(己方rank数字 > 对手rank数字):进球数×0.45
调整后的代码只需修改权重值的顺序:
import pandas as pd import numpy as np df = pd.DataFrame({ 'home_team': ['Ducks', 'Frogs', 'Eagles'], 'away_team': ['Frogs', 'Eagles', 'Ducks'], 'rank_home': [1, 3, 2], 'rank_away': [2, 3, 1], 'home_goals': [4, 6, 5], 'away_goals': [1, 3, 5] }) # 计算主队加权进球(匹配示例逻辑) df['weighted_home'] = np.select( [ df['rank_home'] < df['rank_away'], # 主队排名高于客队 df['rank_home'] == df['rank_away'], # 排名持平 df['rank_home'] > df['rank_away'] # 主队排名低于客队 ], [ df['home_goals'] * 0.15, df['home_goals'] * 0.30, df['home_goals'] * 0.45 ] ) # 计算客队加权进球(匹配示例逻辑) df['weighted_away'] = np.select( [ df['rank_away'] < df['rank_home'], # 客队排名高于主队 df['rank_away'] == df['rank_home'], # 排名持平 df['rank_away'] > df['rank_home'] # 客队排名低于主队 ], [ df['away_goals'] * 0.15, df['away_goals'] * 0.30, df['away_goals'] * 0.45 ] ) print(df)
运行结果中,索引0的Ducks加权进球为 4×0.15=0.6,完全匹配示例要求。
关于条件语句的说明
这里不需要使用and/or,因为三个条件是互斥且覆盖所有可能情况的,直接通过if-elif-else(单条数据处理)或np.select(批量数据处理)按顺序判断即可。
内容的提问来源于stack exchange,提问作者codeinecoder
相关产品推荐
相关产品推荐

