Tôi đến từ một nền sql và tôi sử dụng các bước xử lý dữ liệu sau đây thường xuyên:chức năng cửa sổ SQL giống như ở gấu trúc: Row đánh số bằng Python Pandas Dataframe
- phân vùng bảng dữ liệu bằng một hoặc nhiều lĩnh vực
- Đối với mỗi phân vùng, thêm một rownumber cho mỗi hàng của mình rằng xếp hàng bởi một hoặc nhiều lĩnh vực khác, nơi mà các nhà phân tích xác định tăng dần hoặc giảm dần
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
Tôi đang tìm cách làm gấu trúc tương đương với chức năng này cửa sổ sql:
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
Tôi đã thử những điều sau đây mà tôi đã nhận được để làm việc mà không có 'phân vùng':
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)))
tôi cố gắng để mở rộng ý tưởng này để làm việc với các phân vùng (nhóm trong gấu trúc) nhưng sau không làm việc:
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)
Nhưng tôi chỉ có rất nhiều NaN khi tôi làm điều này.
Lý tưởng nhất, sẽ có một cách gọn gàng để nhân rộng khả năng cửa sổ chức năng của sql (tôi đã tìm ra tập hợp dựa trên cửa sổ ... đó là một lớp lót trong gấu trúc) ... ai đó có thể chia sẻ với tôi cách thành ngữ nhất để số hàng như thế này trong PANDAS?
có vẻ như anh nên để có thể ' .rank' bởi nhiều cột ... –