多次查找True值的数量

时间:2018-11-17 10:37:55

标签: python pandas

在计算出每种事件类型的所有记录的均值之后,我现在必须计算运动员得分高于均值的次数。 我已经找到了一次执行此操作的方法,但我想知道在熊猫中是否有更优雅的方法。 对不起图像,但这可能是我可以向大家展示我已经做过并且想做的最好的方式

编辑: 抱歉,我是该界面的新手。我将尝试使用代码尽可能地清楚。(任何人都知道一种更好的显示数据框的方法,该数据框不是用于堆栈溢出的图像吗?

d = {'Event':['Mens 100m','Womens 100m','Mens 800m', 'Mens 800m'],'Record':[10.06,10.6,50.4,60.5]}
df = pd.DataFrame(data = d)

1。)我需要找到所有不同事件的均值记录集:

for i in range(len(Events)):
     x = df[df['Event'] == Events[i]]['Record'].mean()
     print(Events[i], ":", "{0:.5f}".format(x))

#下面的行为我提供了使用列表补偿的每种不同事件类型的所有均值的列表。

Means =  [df[df['Event']== Events[i]]['Record'].mean() for i in range(len(Events))]

2。)使用这些方法,我必须找到每项赛事的运动员人数,其记录高于上一行中计算出的平均值。

# i = 0 where Events[0] is 'Womens 100m'
i = 0; df[df['Event'] == Events[i]][['Record']] > Means[i]

输出:2

对于所有事件,我都需要计算上述True值的数量。除了将其分配为系列然后计算为True之外,还有其他不错的方法吗? 看起来像这样:

d = {'Athletes over Mean for Each Event':[4,6,10,2,5,6]}
df = pd.DataFrame(data = d)

再次感谢您,希望这次我能说得更清楚。

2 个答案:

答案 0 :(得分:0)

您可以过滤数据框(假设您有一个)并获得长度或形状,如下所示:

  Number_above_mean = len(df[(df[player]==nameyouwant)&(df[score]>df[score].mean())])

Number_above_mean = df[(df[player]==nameyouwant)&(df[score]>df[score].mean())].shape

PS。请添加您的代码和示例数据

答案 1 :(得分:0)

IIUC,您希望统计不同类别中的出现次数,该次数超过该类别的平均值。毫无疑问,下面的代码可以优化,但现在可能对您有所帮助。

import pandas as pd
import numpy as np

df = pd.DataFrame( {
   'A': ['d','d','d','f','f','f','g','g','g','h','h','h'],
   'B': [9,10,11,7,9,10,11,8,12,7,8,12],
    } );

df_grouped = df.groupby('A')['B'].mean()
df_grouped.to_frame()
df_grouped.reset_index()

df1 = df.merge(df_grouped.to_frame(), left_on='A', right_index=True)

df1['num'] = np.where(df1['B_x'] > df1['B_y'], 1, 0)

df2 = df1.groupby('A')['num'].apply(lambda x: (x==1).sum()).reset_index(name='count')

df2


A   count
0   d   1
1   f   2
2   g   2
3   h   1

我已经制作了自己的样本数据。您可以将“ A”与“事件”交换,将“ B”与“记录”交换