Я пришел из sql фона и часто использую следующий шаг обработки данных:
- Разделить таблицу данных на одно или несколько полей
- Для каждого раздела добавьте число к каждой из его строк, которое ранжирует строку по одному или нескольким другим полям, где аналитик указывает восходящий или нисходящий
Пример:
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
Я ищу, как сделать PANDAS эквивалентной этой функции окна sql:
RN = ROW_NUMBER() OVER (PARTITION BY Key1 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
Я попробовал следующее, что я получил, чтобы работать там, где нет "разделов":
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)))
Я пытался расширить эту идею для работы с разделами (группами в пандах), но следующее не сработало:
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)
Но я только что получил много NaNs, когда я это делаю.
В идеале, был бы краткий способ воспроизвести возможность оконной функции sql (я выяснил, что агрегаты на основе окон... что один вкладыш в пандах)... может кто-нибудь поделиться со мной самым идиоматичным способом количество строк, как это в PANDAS?