【问题标题】:How can I make this code into more idiomatic pandas?我怎样才能把这段代码变成更惯用的熊猫?
【发布时间】:2019-06-08 04:12:44
【问题描述】:

有点宽泛的问题,但我不确定如何获得有关如何改进此代码的指针。

我有一个包含投注赔率和比赛结果的数据框,我想计算投资于某支球队的回报。

我现在拥有的代码可以运行,但我觉得它只是依靠apply 方法并进入 Python 来完成 Pandas 可以做的大部分事情。

数据框如下所示:

这是我的代码:

def compute_payout(odds, amount=1):
    if odds < 0:
        return amount/(-1.0 * odds/100.0)
    elif odds > 0:
        return amount/(100.0/odds)

def game_payout(row, team_name):
    if row['home_team'] == team_name:
        if row['home_score'] > row['away_score']:
            return compute_payout(row['home_odds'])
        else:
            return -1
    elif row['away_team'] == team_name:
        if row['away_score'] > row['home_score']:
            return compute_payout(row['away_odds'])
        else:
            return -1

payout = df.apply(lambda row: game_payout(row, team_name), axis=1)

非常感谢任何建议!

【问题讨论】:

  • 文本而不是图像中的数据将有助于其他人复制它。

标签: pandas idioms


【解决方案1】:

numpy.select&amp; 链接的条件用于bitwise AND~ 用于反转布尔掩码:

m11 = df['home_team'] == team_name
m21 = df['away_team'] == team_name

m12 = df['home_score'] > df['away_score']
m22 = df['home_score'] < df['away_score']

vals = [df['home_odds'].apply(compute_payout), -1, df['away_odds'].apply(compute_payout), -1]
payout = np.select([m11 & m12, m11 & ~m12, m21 & m22, m21 & ~m22], vals, default=np.nan)

【讨论】:

  • 这太酷了!一个问题:vals 数组中的df['home_odds']df['away_odds'] 将如何为匹配选择的数据行提供适当的几率? (而不仅仅是整个系列)
  • @JoshReback - 它将掩码列表中的第一个值[m11 &amp; m12, m11 &amp; ~m12, m21 &amp; m22, m21 &amp; ~m22] 映射到 vals 的第一个值,然后是第二个值......并且掩码被链接在一起以实现您在代码中需要的所有组合 -例如if row['home_team'] == team_name: if row['home_score'] &gt; row['away_score']: 转换为 m11 &amp; m12 - 或 (df['home_team'] == team_name) &amp; (df['home_score'] &gt; df['away_score'])
猜你喜欢
  • 2022-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 2012-10-12
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
相关资源
最近更新 更多