grupo pandas por valor único encima de un umbral

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 idcolumna, y añadir una tercera columna llamada unique_above_10y 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 sumpor grupos de GroupBy.transform, por comparación 1y la cadena de &por bit a bit ANDpor 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

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=388139&siteId=1
Recomendado
Clasificación