python - 每组最低条件
问题描述
考虑dataframe
d
以下内容:
d = pd.DataFrame({
'id': ['A', 'A', 'A', 'B', 'B', 'B'],
'name': ['a', 'b', 'd', 'a', 'c', 'e'],
'value': [10, 8, 9, 11, 3, 5],
})
我添加了一个空列d['col'] = pd.Series()
,d
如下所示:
id name value col
0 A a 10 NaN
1 A b 8 NaN
2 A d 9 NaN
3 B a 11 NaN
4 B c 3 NaN
5 B e 5 NaN
我现在想设置d.col
为True
if,对于由 定义的每个组d.id
,如果此条件成立:
d.value[d.name!='a'].min()
最终结果将如下所示:
id name value col
0 A a 10 NaN
1 A b 8 True
2 A d 9 NaN
3 B a 11 NaN
4 B c 3 True
5 B e 5 NaN
我怀疑我需要以d.groupby('id').apply()
某种方式使用,但在设置条件时无法正确使用。
编辑:我对任何巧妙的解决方案持开放态度。重要的是,我希望能够d.col==True
根据排除name=='a'
.
解决方案
您也可以通过检查进行groupby
转换,而不是通过按位链接结果:min
name
a
&
# updated, thx @piR and @quang
d['col'] = d.groupby('id').value.transform('min').eq(d.value) & d.name.ne('a')
根据您的更新,如果您只想“选择获胜者”,让我们保留第一场比赛以保持简单。因此idxmin
,将 , 与索引(假设唯一索引)进行比较并与上述其他条件进行链接:
d['col'] = d.groupby('id').value.transform('idxmin').eq(d.index) & d.name.ne('a')
print(d)
id name value col
0 A a 10 False
1 A b 8 True
2 A d 9 False
3 B a 11 False
4 B c 3 True
5 B e 5 False
推荐阅读
- pandas - 基于可互换出现在两列中的值聚合数据?
- java - 类、接口或枚举预期 2 个错误
- javascript - 如何在页面加载后注入的 HTML 中使用 VueJS?
- django - Django:如何在模板中显示相关的模型字段
- emeditor - 用于跳转到从 Xbench 中搜索的 .txt 文件中的搜索词的命令行选项(并在 EmEditor 中打开)
- javascript - Web 身份验证可以跨浏览器工作吗?
- c++ - 错误:解决:找不到主机(权威)提升野兽
- sql - Postgres knex 查询连接列
- r - 在 ggplot 中使用 plotmath 表达式的两行注释
- php - Codeigniter where 和 where db 使用数组查询