计算满足DataFrame中多个条件的值的百分比

时间:2019-04-22 14:41:10

标签: python pandas function dataframe data-analysis

我有一个DataFrame,其中包含自1985年以来每场March Madness游戏的信息。现在,我试图逐轮计算较高种子的获胜百分比。主要的DataFrame如下所示:

enter image description here

我认为最好的方法是创建单独的函数。第一个处理当分数高于score.1返回团队时以及分数.1高于返回团队1时,然后在函数末尾附加这些。下一个需要满足的条件:您将seed.1高于种子并返回团队,然后将种子高于seed.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']])

2 个答案:

答案 0 :(得分:0)

您可以使用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

答案 1 :(得分:0)

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

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