2016-09-06 13 views
5

Tôi đang đối phó với gấu trúc dataframe và có một khung như thế này:Pandas dày đặc RANK

Year Value 
2012 10 
2013 20 
2013 25 
2014 30 

Tôi muốn làm một equialent để DENSE_RANK() trên (thứ tự theo năm) chức năng. để tạo cột bổ sung như thế này:

Year Value Rank 
    2012 10 1 
    2013 20 2 
    2013 25 2 
    2014 30 3 

Làm thế nào để có thể thực hiện được trong gấu trúc?

Cảm ơn!

Trả lời

6

Sử dụng pd.Series.rank với method='dense'

df['Rank'] = df.Year.rank(method='dense').astype(int) 

df 

enter image description here

4

Bạn có thể chuyển đổi năm thành phân loại và sau đó lấy mã của chúng (thêm một vì chúng không được lập chỉ mục và bạn muốn giá trị ban đầu bắt đầu bằng một ví dụ của bạn).

df['Rank'] = df.Year.astype('category').cat.codes + 1 

>>> df 
    Year Value Rank 
0 2012  10  1 
1 2013  20  2 
2 2013  25  2 
3 2014  30  3 
3

Giải pháp nhanh nhất là factorize:

df['Rank'] = pd.factorize(df.Year)[0] + 1 

Thời gian:

#len(df)=40k 
df = pd.concat([df]*10000).reset_index(drop=True) 

In [13]: %timeit df['Rank'] = df.Year.rank(method='dense').astype(int) 
1000 loops, best of 3: 1.55 ms per loop 

In [14]: %timeit df['Rank1'] = df.Year.astype('category').cat.codes + 1 
1000 loops, best of 3: 1.22 ms per loop 

In [15]: %timeit df['Rank2'] = pd.factorize(df.Year)[0] + 1 
1000 loops, best of 3: 737 µs per loop 
+0

Lưu ý rằng bạn sẽ muốn sử dụng 'sort = True' trong lệnh gọi' factorize', điều này sẽ ảnh hưởng đến thời gian của bạn (trong 3M số lớn df của tôi, phương thức 1, tức là sử dụng ' phương thức rank' hóa ra là nhanh nhất). Lý do bạn cho rằng nó hoạt động, bởi vì các phần tử không trùng lặp của mảng đã được sắp xếp. –

+0

Có, nhưng nó phụ thuộc vào dữ liệu có sắp xếp hay không. Trong mẫu được sắp xếp, vì vậy không cần thiết. – jezrael

+0

Thật vậy, và đó là những gì tôi đã nói. Bởi vì nó được sắp xếp, yếu tố sẽ nhanh hơn. Nói chung, dữ liệu không được sắp xếp và do đó, hệ số và xếp hạng sẽ trả về các câu trả lời khác nhau. Tôi đã thêm nhận xét làm cảnh báo cho người đọc trong tương lai, những người sẽ mù quáng tiếp nhận các giải pháp mà không kiểm tra các điều kiện mà theo đó họ được giả định làm việc. –

Các vấn đề liên quan