Skip to main content
 首页 » 编程设计

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

2025年05月04日31artech

我有这个数据框:

    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 
... 

(这个dataframe比较大,我这里做了个简化)

我想为每种类型创建一个数据框,其中包含 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 对象呢? 如果仅将增长前三名区分开来,最好的办法是什么?

请您参考如下方法:

IIUC,你不需要 groupby,只需 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