为每个类别python选择前10条记录

Posted

技术标签:

【中文标题】为每个类别python选择前10条记录【英文标题】:Select top 10 records for each category python 【发布时间】:2019-07-24 02:20:16 【问题描述】:

如何按列分组并获取该列中每个类别的前 10 条记录?

我要分组的列有 3 个类别“高”、“中”和“低”。

我还有另一列包含用于对数据进行排名的数字数据。

这是我的数据框的头部:

country   designation     points    province               title             year    price   price_category
Italy     Vulkà Bianco     98        Sicily     Nicosia 2013 Vulkà Bianco    2013     65     high

我的代码在这里返回数字列的前 2 个,但我丢失了所有其他列。有没有办法在不丢失其他列的情况下做到这一点?

df.groupby('price_category')['points'].nlargest(2)

这是我的输出,我丢失了所有其他列:

category_column        
high        36528     100
            42197     100
low         5011       95
            15196      95
med         114981     97
            9901       96

我需要这个 ^ 但不会丢失我的其他列。

【问题讨论】:

df.groupby('column').nlargest(10) 【参考方案1】:

你需要:

df = pd.DataFrame('id':[1,2,3,4,5,6,7,8,9,10,11,12], 
                   'level':['low','high','low','medium','medium','high','low','high','medium','high','medium','low'],
                   'values':[23,43,56,12,34,32,18,109,345,21,15,45])

# use nlargest(10) for your problem. 
print(df.groupby('level')['values'].nlargest(2))

输出:

level                                                                                                                                         
high    7     109                                                                                                                             
        1      43                                                                                                                             
low     2      56                                                                                                                             
        11     45                                                                                                                             
medium  8     345                                                                                                                             
        4      34   

【讨论】:

我试过这个,但我失去了我的其余列​​。有没有办法在不丢失我的其他列的情况下做到这一点? 非常感谢,这正是我要找的!但是,如果您要在 df 中再添加 1 列数据,这与该计算无关,有没有办法将该列保留在输出中?【参考方案2】:

使用以下获取索引级别:

df.groupby('price_category')['points'].nlargest(2).index.get_level_values(1)

然后使用索引列表对数据帧进行切片

df.iloc[df.groupby('price_category')['points'].nlargest(2).index.get_level_values(1)]

【讨论】:

【参考方案3】:

这是之前在堆栈pandas groupby sort within groups 上提出的问题并在此处回答。您要做的是创建一个分组数据框,并创建一个具有聚合总和的列。现在,在新的聚合列上创建第二个分组依据。然后,使用帖子中提到的 .nlargest。

【讨论】:

试过这个,但它消除了我的其他专栏。我想保留我的其他专栏

以上是关于为每个类别python选择前10条记录的主要内容,如果未能解决你的问题,请参考以下文章

HQL/SQL 根据计数选择前 10 条记录

MYSQL 从每个类别中选择一个随机记录

如何检索每个类别的最后一条记录(更快的方式)

选择每个类别的最后 3 条新闻 - 两个表 - (MySQL - PHP)

模拟 row_number 函数

有效地为集合中的每个类别选择顶行