BK201:
Una dificil.
Comience con esta trama de datos:
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 |
Quiero grupo por la id
columna, y añadir una tercera columna llamada unique_above_10
y establecer el valor de 1 si hay uno y sólo un valor en el GroupBy que es> 10.
Por lo que la nueva trama de datos debe tener este aspecto:
| 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 |
Jezreel:
Comparar los valores de máscara y contar los valores coincidentes por sum
por grupos de GroupBy.transform
, por comparación 1
y la cadena de &
por bit a bit AND
por máscara 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
detalles :
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