熊猫按高于阈值的唯一值分组

时间:2020-03-30 08:25:53

标签: python pandas

坚强。

从此DataFrame开始:

df = pd.DataFrame({
    'number':[4.4,11, 2.4,5, 12,22],
    'id': [1,1, 2,2, 3,3]
})
| number | id | 
|--------|----|
| 4.4    | 1  |
| 11     | 1  |
| 2.4    | 2  |
| 5      | 2  |
| 12     | 3  | 
| 22     | 3  |

我想按id列分组,并添加第三列,称为unique_above_10,如果groupby中只有一个且只有一个> 10的值,则将该值设置为1。 / p>

因此新的DataFrame应该如下所示:

| number | id | unique_above_10 |
|--------|----|-----------------|
| 4.4    | 1  | 0               |
| 11     | 1  | 1               |
| 2.4    | 2  | 0               |
| 5      | 2  | 0               |
| 12     | 3  | 0               |
| 22     | 3  | 0               |


1 个答案:

答案 0 :(得分:2)

按掩码比较值,按GroupBy.transform每组按sum对匹配值进行计数,按1比较并按&进行按掩码按位AND进行链接m

m = df['number'].gt(10)
df['unique_above_10'] = (m.groupby(df['id']).transform('sum').eq(1) & m).astype(int)
print (df)
   number  id  unique_above_10
0     4.4   1                0
1    11.0   1                1
2     2.4   2                0
3     5.0   2                0
4    12.0   3                0
5    22.0   3                0

详细信息

print (m)
0    False
1     True
2    False
3    False
4     True
5     True
Name: number, dtype: bool

print (m.groupby(df['id']).transform('sum'))
0    1.0
1    1.0
2    0.0
3    0.0
4    2.0
5    2.0
Name: number, dtype: float64

print (m.groupby(df['id']).transform('sum').eq(1))
0     True
1     True
2    False
3    False
4    False
5    False
Name: number, dtype: bool