在Pandas中使用groupby按列值获取前3行

时间:2018-03-04 23:14:17

标签: python pandas pandas-groupby

我有这个数据框:

    person_code  type   growth   size  ...
0 .         231    32     0.54     32
1 .         233    43     0.12    333
2 .         432    32     0.44     21
3 .         431    56     0.32     23
4 .         654    89     0.12     89
5 .         764    32     0.20    211
6 .         434    32     0.82     90
...

(这个数据框非常大,我在这里进行了简化)

我想为每种类型创建一个数据框,其中3个具有更高“增长”的人,按其排序。我希望能够按类型调用它。在这种情况下,让我们使用类型32,因此输出df应如下所示:

    person_code  type   growth   size  ...
6 .         434    32     0.82     90
0 .         231    32     0.54     32
2 .         432    32     0.44     21
...

我知道这会是使用groupby的东西:

groups=dataframe.groupby('type')

但是如何使用类型为32的行调用groupby对象? 什么是最好的只能通过增长来分离前三名?

4 个答案:

答案 0 :(得分:2)

IIUC,您不需要分组,只需query过滤数据框然后nlargest

df.query('type == 32').nlargest(3, 'growth')

并且,要参数化'键入'输入,您可以使用以下语法:

in_type = 32

df.query('type == @in_type').nlargest(3, 'growth')

输出:

     person_code  type  growth  size
6 .          434    32    0.82    90
0 .          231    32    0.54    32
2 .          432    32    0.44    21

或者如果您想使用groupby,您可以使用查询来获取您需要的类型。

type_group_df = df.groupby('type', group_keys=False)\
                  .apply(pd.DataFrame.nlargest,n=3,columns='growth')

要调用它,您可以使用:

type_group_df.query('type == 32')

如果你有一个类型的字符串,它将如下所示:

type_group_df.query('type == "brazilian"')

但是,如果你的专栏名称以任何形式开头都是特殊字符,例如'#',你应该使用它:

type_group_df[type_group_df['#type'] == 32]

输出:

     person_code  type  growth  size
6 .          434    32    0.82    90
0 .          231    32    0.54    32
2 .          432    32    0.44    21

查询另一种类型(43):

type_group_df.query('type == 43')

输出:

     person_code  type  growth  size
1 .          233    43    0.12   333

答案 1 :(得分:1)

您可以同时为所有type执行此操作:

df.groupby('type').apply(lambda dft: dft.nlargest(3, 'growth'))

返回

        person_code  type  growth  size
type                                   
32   6          434    32    0.82    90
     0          231    32    0.54    32
     2          432    32    0.44    21
43   1          233    43    0.12   333
56   3          431    56    0.32    23
89   4          654    89    0.12    89

答案 2 :(得分:1)

喜欢什么?

df.sort_values(['type','person_code']).groupby('type').head(3)
Out[184]: 
   person_code  type  growth  size
0          231    32    0.54    32
2          432    32    0.44    21
6          434    32    0.82    90
1          233    43    0.12   333
3          431    56    0.32    23
4          654    89    0.12    89

答案 3 :(得分:1)

查找每个组的前3个增长值的索引,并将1级索引提供给.loc

idx = df.groupby("type")["growth"].nlargest(3).index

# MultiIndex(levels=[[32, 43, 56, 89], [0, 1, 2, 3, 4, 6]],
#           labels=[[0, 0, 0, 1, 2, 3], [5, 0, 2, 1, 3, 4]],
#           names=['type', None])

dftop3 = df.loc[idx.get_level_values(1)]

    person_code type    growth  size
6   434         32       0.82   90
0   231         32       0.54   32
2   432         32       0.44   21
1   233         43       0.12   333
3   431         56       0.32   23
4   654         89       0.12   89

dftop3[dftop3.type == 32]

person_code type    growth  size
6   434      32     0.82    90
0   231      32     0.54    32
2   432      32     0.44    21