SQL-ähnliche Fensterfunktionen in PANDAS: Zeilennummerierung in Python Pandas Dataframe
Ich komme aus einer sql-hintergrund und ich verwenden die folgenden Daten, Verarbeitungsschritt Häufig:
- Partition der Tabelle von Daten durch ein oder mehrere Felder
- Für jede partition, fügen Sie eine Zeilenzahl auf jeder seiner Reihen, die Reihen der Zeile durch eine oder mehrere andere Felder, auf denen der analyst gibt an, aufsteigend oder absteigend
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 bin auf der Suche nach, wie man die PANDAS äquivalent zu dieser sql-Fenster-Funktion:
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 versucht, die folgenden die, die ich bekommen habe, zu arbeiten, wo es keine 'Partitionen':
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)))
Habe ich versucht zu verlängern, diese Idee zur Arbeit mit Partitionen (Gruppen pandas), 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 wenn ich dies tun.
Ideal, da würde es eine prägnante Art und Weise zu replizieren, die Fenster-Funktion-Funktion von sql (ich habe herausgefunden, das Fenster-basierte Aggregate...das ist ein Einzeiler in pandas)...kann jemand mit mir teilen die meisten idiomatischen Weg, um Anzahl Zeilen, wie dies in PANDAS?
InformationsquelleAutor der Frage AllenQ | 2013-07-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie dies tun, indem Sie mit
groupby
zweimal zusammen mit derrank
Methode:Verwenden Sie die min-Methode argument zu geben, Werte, die denselben data1 derselben RN:
Dann groupby diese Ergebnisse, und fügen Sie die Titel mit dem Bezug auf data2:
Es fühlt sich an wie es sollte, um eine native Möglichkeit, dies zu tun (es kann gut sein!...).
InformationsquelleAutor der Antwort Andy Hayden
können Sie auch
sort_values()
groupby()
und schließlichcumcount() + 1
:ergibt:
PS getestet mit pandas 0.18
InformationsquelleAutor der Antwort MaxU
Können Sie
transform
undRank
zusammen Hier ist ein BeispielHaben Sie einen Blick auf Pandas Rang-Methode für weitere Informationen
InformationsquelleAutor der Antwort sushmit
pandas.lib.fast_zip()
erstellen können, die ein Tupel array aus einer Liste von array. Sie können diese Funktion verwenden, erstellen Sie eine Tupel-Serie, und dann Rang es:das Ergebnis:
InformationsquelleAutor der Antwort HYRY