python-3.x - 在计算平均值时使用 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 命令,但是这种多重选择和平均计算让我发疯。
谢谢
解决方案
@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()
我注意到我们得到了不同的结果,所以我猜我们中的一个人误解了你想要的统计数据。