Pochodzę z sql tle i używam następujący etap przetwarzania danych częściej:SQL-podobne funkcje okna w pand: numeracja rzędów w Pythonie pandy Dataframe
- partycji tabela danych przez jednego lub więcej pól
- Dla każdej partycji, dodać RowNumber do każdego z jego wierszy, które plasuje wiersz przez jednego lub kilku innych dziedzinach, gdzie analityk Określa rosnąco lub malejąco
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
szukam jak zrobić równowartość pandy do tego sql okno funkcji:
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
Próbowałem po których stałam się do pracy, gdzie nie ma „przegródki”:
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)))
starałem się rozszerzyć ten pomysł, aby pracować z partycjami (grup pand), ale dodaje nie działa:
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)
Ale po prostu mam dużo NaN, kiedy to robię.
Idealnie byłoby przedstawić sposób przedstawienia funkcji okna funkcji sql (zrozumiałem agregaty oparte na oknach ... to jedna linijka w pandach) ... czy ktoś może mi udostępnić najbardziej idiomatyczny sposób numerowania takich wierszy w PANDAS?
Wygląda na to, że powinieneś być w stanie ' .rank' przez wiele kolumn ... –