【问题标题】:Calculate the percentage of values that meet multiple conditions in DataFrame计算DataFrame中满足多个条件的值的百分比
【发布时间】:2019-04-22 14:41:09
【问题描述】:

我有一个数据框,其中包含自 1985 年以来每场疯狂三月游戏的信息。现在我正在尝试逐轮计算较高种子的获胜百分比。主 DataFrame 如下所示:

我认为最好的方法是创建单独的函数。第一个处理分数高于 score.1 的返回队和 score.1 高于 score 的返回队。1 然后将它们附加到函数末尾。下一个需要你做种子.1 高于种子并返回团队然后种子高于种子.1 并返回团队.1 然后追加和最后一个函数在它们相等时创建一个函数

def func1(x):
    if tourney.loc[tourney['Score']] > tourney.loc[tourney['Score.1']]:
        return tourney.loc[tourney['Team']]
    elif tourney.loc[tourney['Score.1']] > tourney.loc[tourney['Score']]:
        return tourney.loc[tourney['Team.1']]

func1(tourney.loc[tourney['Score']])

【问题讨论】:

  • 您的问题是什么?

标签: python pandas function dataframe data-analysis


【解决方案1】:

您可以使用 axis=1 将 lambda 函数应用于整个数据帧来应用逐行函数。这将允许您获得True/False'low_seed_wins'

使用新的 True/False 列,您可以获取计数和总和(count 是游戏的数量,sum 是 lower_seed 胜利的数量)。使用它,您可以将总和除以计数以获得获胜率。

这只是因为你的低种子队总是在左边。如果不是,那将会更复杂一些。

import pandas as pd
df = pd.DataFrame([[1987,3,1,74,68,5],[1987,3,2,87,81,6],[1987,4,1,84,81,2],[1987,4,1,75,79,2]], columns=['Year','Round','Seed','Score','Score.1','Seed.1'])

df['low_seed_wins'] = df.apply(lambda row: row['Score'] > row['Score.1'], axis=1)

df = df.groupby(['Year','Round'])['low_seed_wins'].agg(['count','sum']).reset_index()

df['ratio'] = df['sum'] / df['count']

df.head()


Year    Round   count   sum     ratio
0   1987    3   2       2.0     1.0
1   1987    4   2       1.0     0.5

【讨论】:

    【解决方案2】:

    您应该通过检查第一队和第二队的两个条件来计算这一点。这将返回一个布尔值,其总和是它为真的情况数。然后只需除以整个数据帧的长度即可得到百分比。没有测试数据很难准确检查

    (
        ((tourney['Seed'] > tourney['Seed.1']) & 
         (tourney['Score'] > tourney['Score.1'])) || 
        ((tourney['Seed.1'] > tourney['Seed']) & 
         (tourney['Score.1'] > tourney['Score']))
    ).sum() / len(tourney)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 2019-03-11
      • 2013-10-14
      • 1970-01-01
      相关资源
      最近更新 更多