我有以下df,它是从here改编而来的

import pandas as pd    
df = pd.DataFrame({'group':[1,1,1,2,2,2,3,3,3],
               'value':[1,2,3,1,2,3,4,3,2]})

我希望得到以下结果:

df1 = pd.DataFrame({'group':[1,1,1,2,2,2,3,3,3],
               'value':[0,2,3,0,2,3,4,3,0]})

逻辑是(1) for each 组 Select 前2个数字,(2)将其他值设置为0.

有什么建议吗?谢谢

推荐答案

使用nlargest/组进行布尔索引:

m = df.groupby('group')['value'].apply(lambda g: g.isin(g.nlargest(2)))

df['value'] = df['value'].where(m, 0)

输出(为清晰起见,作为新列"value2")

   group  value  value2
0      1      1       0
1      1      2       2
2      1      3       3
3      2      1       0
4      2      2       2
5      2      3       3
6      3      4       4
7      3      3       3
8      3      2       0

Python相关问答推荐

在Python中对分层父/子列表进行排序

连接两个具有不同标题的收件箱

ModuleNotFound错误:没有名为Crypto Windows 11、Python 3.11.6的模块

对所有子图应用相同的轴格式

ODE集成中如何终止solve_ivp的无限运行

在Django admin中自动完成相关字段筛选

pandas:对多级列框架的列进行排序/重新排序

Flask Jinja2如果语句总是计算为false&

Pandas:计算中间时间条目的总时间增量

在代码执行后关闭ChromeDriver窗口

循环浏览每个客户记录,以获取他们来自的第一个/最后一个渠道

Cython无法识别Numpy类型

如果包含特定值,则筛选Groupby

操作布尔值的Series时出现索引问题

文本溢出了Kivy的视区

时长超过24小时如何从Excel导入时长数据

时间戳上的SOAP头签名无效

Scipy.linprog的可行性有问题吗?(A_ub@x0<;=b_ub).all()为True-但是-linprog(np.zeros_like(X0),A_ub=A_ub,b_ub=b_ub)不可行

IpyWidget Select 框未打开

将多行数据循环到嵌套框架中的单行