pandas - 我怎样才能使这段代码变成更惯用的 Pandas ?

标签 pandas idioms

这是一个广泛的问题,但我不确定如何获得有关如何改进此代码的指导。

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

我现在的代码可以工作,但我觉得它仅仅依靠 apply 方法并放入 Python 中,就忽略了 Pandas 可以做的很多事情。

数据框如下所示: enter image description here

这是我的代码:

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)

非常感谢任何建议!

最佳答案

使用numpy.select条件由 & 链接用于 按位 AND~ 用于反转 bool 掩码:

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)

关于pandas - 我怎样才能使这段代码变成更惯用的 Pandas ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54177011/

相关文章:

go - 使用 'comma ok' 成语还是返回指针?

Scala风格: More than one class in a file?

haskell - 用于学习惯用 Haskell 的资源(eta 缩减、符号中缀运算符、库等)

design-patterns - Scala 中针对经常遇到的问题建立了哪些常见模式/解决方案

python - 如何找到 pandas 数据框字符串列中的最大单词数?

python - 使用 Pandas 基于正则表达式分离列数据

python - 绘制一系列频率的直方图

python - 查看 pandas 系列的每一行中是否有项目

python - Pandas 的调理

terminology - 著名的同名编程技术