python - 熊猫有条件地在聚合操作中包含值
问题描述
对于以下数据框:
import pandas as pd
df = pd.DataFrame({
'trigger':[0,0,0, 1,1,1, 2,2,2, 3,3,3,],
'score' :[1,0,0, 0,1,0 ,0,0,1 ,1,1,1],
'label' :[1,0,0, 0,1,0 ,0,0,1 ,1,1,1]
})
# in reality ranked using some other column
df['rank'] = df.groupby(['trigger']).cumcount()
display(df)
我几乎想计算:
d_eval = df[df['rank'] <=2]
d_eval.groupby(['trigger']).agg({'score':'max', 'label':'max'})
但是,我不想放弃其他值(不包括在排名过滤器中),而只考虑聚合中过滤的值。
还有其他方法吗:
- 过滤
- 加入结果
- 继续
大熊猫更直接?
解决方案
一种选择是merge
:
d_eval = (df[df['rank'] <=2].groupby(['trigger'])
.agg({'score':'max', 'label':'max'})
)
df.merge(d_eval, on='trigger', suffixes=['','_max'])
输出:
trigger score label rank score_max label_max
0 0 1 1 0 1 1
1 0 0 0 1 1 1
2 0 0 0 2 1 1
3 1 0 0 0 1 1
4 1 1 1 1 1 1
5 1 0 0 2 1 1
6 2 0 0 0 1 1
7 2 0 0 1 1 1
8 2 1 1 2 1 1
9 3 1 1 0 1 1
10 3 1 1 1 1 1
11 3 1 1 2 1 1
或某种单线
df.merge(df.assign(rank=df.groupby('trigger').cumcount())
.query('rank <=2')
.groupby('trigger')[['score','label']].max(),
on='trigger', suffixes=['','_max']
)
推荐阅读
- python - PyCharm 使用 TensorFlow 2 报告导入错误
- mysql - MySQL 8 InnoDB 分区 - 最大分区数
- java - 我应该安装哪个 Java JDK 才能使用 Android Studio
- encoding - url 编码问题 - tableau js api
- php - 如何将 div 添加到最后一个帖子和每 5 个帖子
- r - 仅当满足条件时才在 dplyr 组中过滤,否则不过滤
- python - 合并两个具有相同数量元素的列表并按顺序添加它们
- c# - dotnet core 3.0 在 vs 中打开解决方案时无法找到 dotnetcore sdk
- java - 给定一个字符串,判断它是否是回文,只考虑字母数字字符并忽略大小写
- flutter - 使用pop时如何在flutter中重新加载或调用某些函数initState()