Saltar al contenido

Funciones de ventana similares a SQL en PANDAS: Numeración de filas en Python Pandas Dataframe

Este tutorial fue probado por nuestros expertos para asegurar la exactitud de nuestro tutorial.

Solución:

también puedes usar sort_values(), groupby() y finalmente cumcount() + 1:

df['RN'] = df.sort_values(['data1','data2'], ascending=[True,False]) 
             .groupby(['key1']) 
             .cumcount() + 1
print(df)

rendimientos:

   data1  data2 key1  RN
0      1      1    a   1
1      2     10    a   2
2      2      2    a   3
3      3      3    b   1
4      3     30    a   4

PS probado con pandas 0.18

Puedes hacer esto usando groupby dos veces junto con el rank método:

In [11]: g = df.groupby('key1')

Use el argumento del método min para dar valores que comparten los mismos datos1 el mismo RN:

In [12]: g['data1'].rank(method='min')
Out[12]:
0    1
1    2
2    2
3    1
4    4
dtype: float64

In [13]: df['RN'] = g['data1'].rank(method='min')

Y luego agrupe por estos resultados y agregue el rango con respecto a data2:

In [14]: g1 = df.groupby(['key1', 'RN'])

In [15]: g1['data2'].rank(ascending=False) - 1
Out[15]:
0    0
1    0
2    1
3    0
4    0
dtype: float64

In [16]: df['RN'] += g1['data2'].rank(ascending=False) - 1

In [17]: df
Out[17]:
   data1  data2 key1  RN
0      1      1    a   1
1      2     10    a   2
2      2      2    a   3
3      3      3    b   1
4      3     30    a   4

Parece que debería haber una forma nativa de hacer esto (¡bien podría haberla!…).

Puedes usar transform y Rank juntos Aquí hay un ejemplo

df = pd.DataFrame('C1' : ['a','a','a','b','b'],
           'C2' : [1,2,3,4,5])
df['Rank'] = df.groupby(by=['C1'])['C2'].transform(lambda x: x.rank())
df

ingrese la descripción de la imagen aquí

Eche un vistazo al método Pandas Rank para obtener más información.

Nos puedes corroborar nuestra investigación fijando un comentario o valorándolo te damos la bienvenida.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *