我有一个与此相似的数据框:
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命令,但是这种多重选择和平均计算使我发疯。
谢谢
答案 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()
我注意到我们得到了不同的结果,所以我想我们当中有一个人误解了您想要的统计信息。