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使用groupby函数基于指定分组变量对dataframe数据进行分组使用apply函数计算每个分组指定数值变量最大值所在的数据行(编写自定义函数其中使用nlargest)
如何使用 Pandas 从 InfluxDB 检索超过 10k 行?
pandas计算dataframe结束时间列和起始时间列的时间差使用nlargest函数获取dataframe数据时间差前5大的样本数据