SQL-ähnliche Fensterfunktionen in PANDAS: Zeilennummerierung in Python Pandas Dataframe

Ich komme aus einem SQL-Hintergrund und verwende häufig den folgenden Datenverarbeitungsschritt:

Partitionieren Sie die Datentabelle nach einem oder mehreren FeldernFügen Sie für jede Partition eine neue Nummer zu jeder Zeile hinzu, die die Zeile nach einem oder mehreren anderen Feldern ordnet, wobei der Analyst aufsteigend oder absteigend angibt

EX:

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        

Ich suche, wie man das PANDAS macht, das zu dieser SQL-Fensterfunktion äquivalent ist:

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

Ich habe Folgendes ausprobiert, was ich zum Arbeiten gebracht habe, wenn es keine "Partitionen" gibt:

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

Ich habe versucht, diese Idee auf Partitionen (Gruppen in Pandas) auszudehnen, aber Folgendes hat nicht funktioniert:

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)

Aber ich habe gerade eine Menge NaNs bekommen, wenn ich das mache.

Im Idealfall gibt es eine prägnante Möglichkeit, die Fensterfunktionsfähigkeit von SQL zu replizieren (ich habe die fensterbasierten Aggregate herausgefunden ... das ist ein Einzeiler in Pandas) Zahlenreihen wie diese in PANDAS?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage