我有一个多级分组的pandas数据框,如下所示:
date AccountNum ProgramName Duration
2017-11-12 12345 program1 200
program2 300
program4 100
program5 250
45678 program7 200
program2 300
program8 100
program5 250
.... more accounts for 2017-11-12
2017-11-18 12345 program6 200
program2 300
program3 100
program5 250
45678 program6 200
program3 300
program4 100
program5 250
etc-etc
持续时间已经汇总,它是按日期,帐号和程序名称的平均值。 以下是获取上述数据框的代码:
grouped = programs.groupby([pd.Grouper(freq='W'),'AccNum','ProgramName'])['Duration'].agg('mean')
“持续时间”列是每个帐户(以及每周)的每周平均值。 我需要每周为每个帐户选择前3个程序。
我尝试了nlargest()函数,但它似乎对我不起作用,因为我要么只返回3个帐户,要么丢失日期列。任何帮助将不胜感激。
编辑: 这就是我想要的结果:
date AccountNum ProgramName Duration
2017-11-12 12345 program2 300
program5 250
program1 200
45678 program2 300
program5 259
program7 200
.... more accounts for 2017-11-12
2017-11-18 12345 program2 300
program5 250
program6 200
45678 program3 300
program5 250
program6 200
.... more dates and more accounts ..
基本上,我需要保持组结构 - 按日期/按帐户/前3个程序根据持续时间。此练习的最终目标是能够查看每个帐户的前3个程序的一周又一周的持续时间变化。
答案 0 :(得分:0)
这就是你想要的吗?
In [143]: df.groupby(level=[0,1], as_index=False).apply(lambda x: x.nlargest(3, columns=['Duration'])).reset_index(level=0, drop=True)
Out[143]:
ProgramName Duration
date AccountNum
2017-11-12 12345.0 program2 300
12345.0 program5 250
12345.0 program1 200
45678.0 program2 300
45678.0 program5 250
45678.0 program7 200
2017-11-18 12345.0 program2 300
12345.0 program5 250
12345.0 program6 200
45678.0 program3 300
45678.0 program5 250
45678.0 program6 200