pandas nlargest 返回超过 n 行

Posted

技术标签:

【中文标题】pandas nlargest 返回超过 n 行【英文标题】:pandas nlargest is returning more than n rows 【发布时间】:2016-06-03 23:40:11 【问题描述】:

我有一个DataFrame,看起来像这样:

            name      value 
 date   
 2016-05-01 kelly      20  
 2016-05-05 john       12  
 2016-05-05 sarah      25  
 2016-05-05 george     3  
 2016-05-05 tom        40  
 2016-05-07 kara       24  
 2016-05-07 jane       90  
 2016-05-07 sally      39  
 2016-05-07 sam        28  

我想最好按日期获取前 3 行(根据值)。 我期待这样的事情:

            name      value 
 date   
 2016-05-01 kelly      20  
 2016-05-05 john       12  
 2016-05-05 sarah      25  
 2016-05-05 tom        40  
 2016-05-07 jane       90  
 2016-05-07 sally      39  
 2016-05-07 sam        28  

但我也同意:

            name      value 
 date   
 2016-05-05 tom        40  
 2016-05-07 jane       90  
 2016-05-07 sally      39  

我尝试了df.nlargest(3, 'value'),但得到了这个奇怪的结果:

         name        value 
 date       
 2016-05-01 kelly      20  
 2016-05-01 kelly      20  
 2016-05-01 kelly      20  
 2016-05-05 tom        40  
 2016-05-05 tom        40  
 2016-05-05 tom        40  
 2016-05-05 sarah      25  
 2016-05-05 sarah      25  
 2016-05-05 sarah      25  
 2016-05-07 kara       24  
 2016-05-07 kara       24  
 ...
 2016-05-07 sally      39  
 2016-05-07 sally      39  
 2016-05-07 jane       90  
 2016-05-07 jane       90  
 2016-05-07 jane       90  

我试着每天运行它:[df.ix[day].nlargest(3, 'value') for day in df.index.unique()]

但我遇到了同样的问题(每个名称重复 3 次)

【问题讨论】:

【参考方案1】:

首先,这将完成工作:

df.sort_values('value', ascending=False).groupby(level=0).head(3).sort_index()

【讨论】:

谢谢!所以 groupby(level=0) + 排序得到了每个日期的结果,就像我需要的那样。我猜 nlargest 在这个用例中不可用【参考方案2】:

使用[:n] 切片sort_values() 结果

在descending mode 中使用sort_values() 并取first n results in a slice,然后使用sort_index() 保留日期monotonically increasing。

import pandas as pd
import cStringIO

df  = pd.read_table(cStringIO.StringIO('''
 date   name      value 
 2016-05-01 kelly      20  
 2016-05-05 john       12  
 2016-05-05 sarah      25  
 2016-05-05 george     3  
 2016-05-05 tom        40  
 2016-05-07 kara       24  
 2016-05-07 jane       90  
 2016-05-07 sally      39  
 2016-05-07 sam        28 
'''), sep=' *', index_col=0, engine='python')

print 'Original DataFrame:'
print df
print

df_top3 = df.sort_values('value', ascending=False)[:3].sort_index()
print 'Top 3 Largest value DataFrame:'
print df_top3
print

Original DataFrame:
              name  value
date                     
2016-05-01   kelly     20
2016-05-05    john     12
2016-05-05   sarah     25
2016-05-05  george      3
2016-05-05     tom     40
2016-05-07    kara     24
2016-05-07    jane     90
2016-05-07   sally     39
2016-05-07     sam     28

Top 3 Largest value DataFrame:
             name  value
date                    
2016-05-05    tom     40
2016-05-07   jane     90
2016-05-07  sally     39

【讨论】:

以上是关于pandas nlargest 返回超过 n 行的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 在 groupby 和 nlargest 之后创建额外(重复)索引

Pandas 最大行数,前 n 最大

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用apply函数计算每个分组指定数值变量最大值所在的数据行(编写自定义函数其中使用nlargest)

Pandas groupby nlargest sum

如何使用 Pandas 从 InfluxDB 检索超过 10k 行?

pandas计算dataframe结束时间列和起始时间列的时间差使用nlargest函数获取dataframe数据时间差前5大的样本数据