Estoy tratando de calcular el valor mínimo de la segunda columna que pertenece a ciertos valores de la primera columna. entonces mi dataframe es el siguiente:

name        CEMS    star
ACC         CEMS-1  3
ACC         CEMS-2  4
ACC         CEMS-3  5
ACC         CEMS-4  5
ARTi        CEMS-1  4
ARTi        CEMS-2  5
ARTi        CEMS-3  4
ARTi        CEMS-4  5

Ahora quiero encontrar un valor mínimo de estrellas para cada nombre en una columna separada de los diferentes valores de CEMS

Quiero que mi marco de datos se vea así:

Name            CEMS    star  min
ACC         CEMS-1        3    
ACC         CEMS-2        4     
ACC         CEMS-3        5     
ACC         CEMS-4        5     3
ARTi        CEMS-1        4     
ARTi        CEMS-2        5     
ARTi        CEMS-3        4     
ARTi        CEMS-4        5     4

¿Alguien puede ayudarme?

-1
Abhishek2332 10 sep. 2018 a las 00:53

3 respuestas

La mejor respuesta

transform no es suficiente. Deberá enmascarar todo menos el último índice. Puede realizar una asignación alineada de índice para hacerlo.

g = df.groupby('name')['star']
df['minstar'] = pd.Series(g.min(), index=g.apply(pd.Series.last_valid_index))
df.fillna('')

   name    CEMS  star minstar
0   ACC  CEMS-1     3        
1   ACC  CEMS-2     4        
2   ACC  CEMS-3     5        
3   ACC  CEMS-4     5       3
4  ARTi  CEMS-1     4        
5  ARTi  CEMS-2     5        
6  ARTi  CEMS-3     4        
7  ARTi  CEMS-4     5       4
1
cs95 9 sep. 2018 a las 22:03

Para cambiar solo el último valor, como en el resultado esperado

ind = df.groupby('name', as_index=False).apply(lambda s: s.index[-1])
df.loc[ind, 'min'] = df.groupby('name').star.min().values

    name    CEMS    star    min
0   ACC     CEMS-1  3       NaN
1   ACC     CEMS-2  4       NaN
2   ACC     CEMS-3  5       NaN
3   ACC     CEMS-4  5       3.0
4   ARTi    CEMS-1  4       NaN
5   ARTi    CEMS-2  5       NaN
6   ARTi    CEMS-3  4       NaN
7   ARTi    CEMS-4  5       4.0
0
rafaelc 9 sep. 2018 a las 21:59

Puede usar GroupBy + transform con min. Si su marco de datos también está ordenado por name, puede usar drop_duplicates para su salida deseada.

df['star_min'] = df.groupby('name')['star'].transform('min')\
                   .drop_duplicates(keep='last')

print(df)

   name    CEMS  star  star_min
0   ACC  CEMS-1     3       NaN
1   ACC  CEMS-2     4       NaN
2   ACC  CEMS-3     5       NaN
3   ACC  CEMS-4     5       3.0
4  ARTi  CEMS-1     4       NaN
5  ARTi  CEMS-2     5       NaN
6  ARTi  CEMS-3     4       NaN
7  ARTi  CEMS-4     5       4.0
0
jpp 9 sep. 2018 a las 22:03