私はSQLのバックグラウンドから来ており、次のデータ処理ステップを頻繁に使用しています。
- 1 つ以上のフィールドでデータのテーブルを分割する
- パーティションごとに、アナリストが昇順または降順を指定する 1 つ以上の他のフィールドによって行をランク付けする行番号を各行に追加します。
元:
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
このSQLウィンドウ関数に相当するPANDASを実行する方法を探しています:
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)
しかし、これを行うと、多くの NaN が得られました。
理想的には、SQLのウィンドウ関数機能を複製する簡潔な方法があるでしょう(ウィンドウベースの集計を理解しました...これはパンダのワンライナーです)...誰かが私と最も慣用的な方法を共有できますかPANDAS でこのような行に番号を付けますか?