从多索引pandas数据帧中获取前3个值

时间:2018-02-22 19:46:18

标签: python pandas

我有一个多级分组的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个程序的一周又一周的持续时间变化。

1 个答案:

答案 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