我有一个熊猫的日期和价值的数据。
import pandas as pd
df = pd.DataFrame({'date':['11-10','11-10','11-10','12-10','12-10','12-10'],
'id': [1, 1, 2, 1, 1, 2],
'val':[20, 30, 40, 50, 25, 35] })
我希望过滤器DataFrame只包括每个日期的顶部和底部N行。假设N= 2,那么,dataframe将丢弃第1行11-10 20
和第5行12-10 25
。
希望找到一种能够针对不同N
值的解决方案。
发布于 2021-12-01 22:28:50
您可以按date
对数据进行分组,然后为val
列调用nlargest
,传递N
的值
>>> df.groupby('date')['val'].nlargest(2)
date
11-10 2 40
1 30
12-10 3 50
5 35
Name: val, dtype: int64
如果需要,可以在结果系列上调用to_frame()
将其转换为数据格式。
对于更新的问题,您仍然可以通过一些额外的工作来实现上面的代码,以获得ids,然后与原始的dataframe进行内部合并:
out= (df.set_index('id')
.groupby(['date'])['val']
.nlargest(2)
.to_frame('val')
.reset_index()
.merge(df, how='inner')
)
输出:
date id val
0 11-10 2 40
1 11-10 1 30
2 12-10 1 50
3 12-10 2 35
发布于 2021-12-01 23:04:24
一种选择是对列进行排序,并在groupby上取尾:
(df.sort_values(['date', 'val'])
.groupby('date', sort = False)
.tail(n=2)
)
date id val
1 11-10 1 30
2 11-10 2 40
5 12-10 2 35
3 12-10 1 50
https://stackoverflow.com/questions/70192012
复制相似问题