Funciones de ventana tipo SQL en PANDAS: Numeración de filas en el marco de datos de Python Pandas
Vengo de un fondo de sql y uso el siguiente paso de procesamiento de datos con frecuencia:
Partición de la tabla de datos por uno o más camposPara cada partición, agregue un número a cada una de sus filas que clasifique la fila por uno o más campos, donde el analista especifica ascendente o descendenteEX:
df = pd.DataFrame({'key1' : ['a','a','a','b','a'],
'data1' : [1,2,2,3,3],
'data2' : [1,10,2,3,30]})
df
data1 data2 key1
0 1 1 a
1 2 10 a
2 2 2 a
3 3 3 b
4 3 30 a
Estoy buscando cómo hacer el equivalente de PANDAS a esta función de ventana de sql:
RN = ROW_NUMBER() OVER (PARTITION BY Key1, Key2 ORDER BY Data1 ASC, Data2 DESC)
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
He intentado lo siguiente que he llegado a trabajar donde no hay 'particiones':
def row_number(frame,orderby_columns, orderby_direction,name):
frame.sort_index(by = orderby_columns, ascending = orderby_direction, inplace = True)
frame[name] = list(xrange(len(frame.index)))
Intenté extender esta idea para trabajar con particiones (grupos en pandas) pero lo siguiente no funcionó:
df1 = df.groupby('key1').apply(lambda t: t.sort_index(by=['data1', 'data2'], ascending=[True, False], inplace = True)).reset_index()
def nf(x):
x['rn'] = list(xrange(len(x.index)))
df1['rn1'] = df1.groupby('key1').apply(nf)
Pero acabo de recibir muchos NaN cuando hago esto.
Idealmente, habría una forma sucinta de replicar la función de la función de ventana de sql (he descubierto los agregados basados en la ventana ... eso es un liner en pandas) ... alguien puede compartir conmigo la forma más idiomática de ¿Numerosas filas como esta en PANDAS?