首页 > 解决方案 > 在计算平均值时使用 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.001)。但是这个最小值和最大值必须根据当天的平均值计算。

例如,对于游戏“数独”,第一个“周一”的平均值为 (3.4/2),第二个周一的平均值为 3/1,周二的平均值为 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 命令,但是这种多重选择和平均计算让我发疯。

谢谢

标签: python-3.xpandaspandas-groupby

解决方案


@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()

我注意到我们得到了不同的结果,所以我猜我们中的一个人误解了你想要的统计数据。


推荐阅读