Uso de Pandas para encontrar valores mínimos de filas agrupadas

Esta podría ser una pregunta trivial, pero todavía estoy tratando de averiguar pandas / numpy.

Entonces, supongamos que tengo una tabla con la siguiente estructura:

group_id | col1 | col2 | col3 | "A" | "B" x | 1 | 2 | 3 | NaN | 1 x | 3 | 2 | 3 | 1 | 1 x | 4 | 2 | 3 | 2 | 1 y | 1 | 2 | 3 | NaN | 3 y | 3 | 2 | 3 | 3 | 3 z | 3 | 2 | 3 | 10 | 2 z | 2 | 2 | 3 | 6 | 2 z | 4 | 2 | 3 | 4 | 2 z | 4 | 2 | 3 | 2 | 2 

Tenga en cuenta que hay un group_id que agrupa elementos en cada fila. Así que al principio, tengo los valores para las columnas group_id y col1-col3.

Luego, para cada fila, si col1, col2 o col3 tienen un valor = 1, entonces “A” es NaN, de lo contrario, el valor se basa en una fórmula (irrelevante para aquí, así que puse algunos números en su lugar).

Eso, sé hacer usando:

 df["A"] = np.where(((df['col1'] == 1)|(df['col2']== 1) | (df['col3']) == 1))), NaN, value) 

Pero para la columna “B”, necesito completarla con el mínimo de valores de la columna A para un grupo específico.

Entonces, por ejemplo, “B” es igual a “1” para todas las filas con el grupo X porque el valor mínimo en la columna A para todas las filas del grupo “x” es igual a 1.

De manera similar, para las filas en el grupo “y”, el valor mínimo es 3, y para el grupo “z” el valor mínimo es 2. ¿Cómo hago exactamente eso usando pandas …? Me está confundiendo un poco más porque el número de filas para un grupo específico puede ser de tamaño variable.

Si todos fueran del mismo tamaño, podría decir que llénelo con el mínimo de valores en un rango preestablecido.

Espero que tenga sentido; Por favor, avíseme si debo proporcionar un ejemplo más claro o aclarar algo.

Para obtener el mínimo de la columna A para cada grupo use transform

 df.groupby('group_id')['A'].transform('min') 
  • centrarse en solo ['col1', 'col2', 'col3']
  • ver si son iguales a 1 con eq(1) equivalente a == 1
  • ver si alguno es igual a uno a lo largo de axis=1 con any(1)
  • usar loc para hacer la asignacion

 anyone = df[['col1', 'col2', 'col3']].eq(1).any(1) df.loc[anyone, 'A'] = np.nan 

equivalente numpy

 anyone = (df[['col1', 'col2', 'col3']].values == 1).any(1) df.A = np.where(anyone, np.nan, df.A)