首页 > 解决方案 > 每组最低条件

问题描述

考虑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.colTrueif,对于由 定义的每个组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'.

标签: pythonpandasdataframepandas-groupby

解决方案


您也可以通过检查进行groupby转换,而不是通过按位链接结果:minnamea&

# 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

推荐阅读