在计算平均值的同时,使用groupby计算最小值和最大值

时间:2019-09-13 08:24:45

标签: python-3.x pandas pandas-groupby

我有一个与此相似的数据框:

day         |   points     |    tries    |        game
monday      |      3.4     |      2      |      sudoku
monday      |      3       |      1      |      sudoku
monday      |      2.1     |      4      |      tetris
monday      |      2.7     |      3      |      tetris
tuesday     |      1.1     |      2      |      sudoku
wednesday   |      0       |      2      |      sudoku
tuesday     |      3.3     |      2      |      tetris

我正在尝试先按游戏分组,然后在每个不同的“游戏”中分组,然后按“天”分组,然后计算最大值和最小值(但每个“日”分别为0,不包括0分,例如> 0.001) )。但是必须根据当天的平均值来计算此最小值和最大值。

例如,对于游戏“数独”,第一个“星期一”的平均值为(3.4 / 2),第二个星期一的平均值为3/1,星期二的平均值为1.1 / 2,星期三的平均值为1.1 / 2。 0/2,但如前所述,将不计0分。

所以对于数独,结果应该类似于:

sudoku      |average_points|    tries    |        day
min         |     0.55     |      2      |      tuesday
max         |      3       |      1      |      monday

并且应该在每个“游戏”中显示此类表格。

我一直在阅读有关groupby的信息,但是我没有一天去做所有这些事情,并且同时计算每个组的average_points。

此外,例如在尝试次数大于10的计算行中,我们将如何做?

任何帮助将不胜感激。

这是为了尝试更轻松地分析某些csv文件。我已经能够打开数据,读取数据并执行一些简单的groupby命令,但是这种多重选择和平均计算使我发疯。

谢谢

2 个答案:

答案 0 :(得分:0)

我相信您需要:

#filter out 0 points
df = df[df['points'].ne(0)]
#create average column  
df = df.assign(average_points = df['points'].div(df['tries']))
#grouping object and processing column of averages
g = df.groupby('game')['average_points']
#join together rows by minimal and maximal averages with keys for get min, max to column
df = (pd.concat([df.loc[g.idxmin()], 
                 df.loc[g.idxmax()]], keys=('min','max'))
       .sort_values('game')
       .reset_index(level=0)
       .rename(columns={'level_0':'type'}))
print (df)
  type      day  points  tries    game  average_points
4  min  tuesday     1.1      2  sudoku           0.550
1  max   monday     3.0      1  sudoku           3.000
2  min   monday     2.1      4  tetris           0.525
6  max  tuesday     3.3      2  tetris           1.650

答案 1 :(得分:0)

@jezrael为您提供了一个优雅的纯pandas解决方案。我从字面上理解了您的输出:

# Make the 'average' column.
df['average_points'] = df.points / df.tries

# Eliminate zeros.
df = df[df.average_points > 0]

# Print the tables.
for game, group in df.groupby('game'):
    print(f'{game:<10s}|average_points|{"tries":^10s}|{"day":>10s}')

    minn = group.loc[group.average_points.idxmin()]
    print(f'{"min":<10s}|{minn.average_points:^14.2f}|{minn.tries:^10d}|{minn.day:>10s}')

    maxx = group.loc[group.average_points.idxmax()]
    print(f'{"max":<10s}|{maxx.average_points:^14.2f}|{maxx.tries:^10d}|{maxx.day:>10s}')

    print()

我注意到我们得到了不同的结果,所以我想我们当中有一个人误解了您想要的统计信息。