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
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.