Tengo un marco de datos

  Group Score Rank
   1     0     3
   1     4     1
   1     2     2
   2     3     2
   2     1     3
   2     7     1

Tengo que tomar la diferencia de la puntuación en el siguiente rango dentro de cada grupo. Por ejemplo, en el rango del Grupo 1 (1) - Rango (2) = 4 - 2

Salida esperada:

    Group Score Rank  Difference
    1     0     3        0
    1     4     1        2
    1     2     2        2
    2     3     2        2
    2     1     3        0
    2     7     1        4
0
tj judge 8 jun. 2021 a las 22:42

2 respuestas

La mejor respuesta

Puedes probar:

df = df.sort_values(['Group', 'Rank'],ascending = [True,False])
df['Difference'] =df.groupby('Group', as_index=False)['Score'].transform('diff').fillna(0).astype(int)

Salida:

   Group  Score  Rank  Difference
0      1      0     3           0
2      1      2     2           2
1      1      4     1           2
4      2      1     3           0
3      2      3     2           2
5      2      7     1           4

Nota: El resultado se ordena en función de la columna rank.

1
Nk03 8 jun. 2021 a las 19:51

Creo que puede crear una nueva columna para los valores en el siguiente rango usando el turno () y luego calcule la diferencia. Puedes ver los siguientes códigos:

# Sort the dataframe
df = df.sort_values(['Group','Rank']).reset_index(drop=True)

# Shift up values by one row within a group
df['Score_next'] = df.groupby('Group')['Score'].shift(-1).fillna(0)

# Calculate the difference
df['Difference'] = df['Score'] - df['Score_next']

Aquí está el resultado:

print(df)

   Group  Score  Rank  Score_next  Difference
0      1      4     1         2.0         2.0
1      1      2     2         0.0         2.0
2      1      0     3         0.0         0.0
3      2      7     1         3.0         4.0
4      2      3     2         1.0         2.0
5      2      1     3         0.0         1.0
1
Crystal L 8 jun. 2021 a las 20:18