2013-07-20 32 views
13

Tôi có một số người dùng được xác định mà tôi muốn so sánh với một cột nhất định của một khung dữ liệu.trả lại hàng trong một khung dữ liệu gần nhất với số do người dùng xác định

Tôi muốn trả về các hàng của một khung dữ liệu chứa (trong một cột nhất định của df, như df.num) 5 số gần nhất với số đã cho x.

Bất kỳ đề xuất nào về cách tốt nhất để làm điều này mà không có vòng lặp sẽ được đánh giá cao.

Trả lời

23

Tôi nghĩ rằng bạn có thể sử dụng phương pháp argsort:

>>> df = pd.DataFrame({"A": 1e4*np.arange(100), "num": np.random.random(100)}) 
>>> x = 0.75 
>>> df.ix[(df.num-x).abs().argsort()[:5]] 
     A  num 
66 660000 0.748261 
92 920000 0.754911 
59 590000 0.764449 
27 270000 0.765633 
82 820000 0.732601 
>>> x = 0.33 
>>> df.ix[(df.num-x).abs().argsort()[:5]] 
     A  num 
37 370000 0.327928 
76 760000 0.327921 
8 80000 0.326528 
17 170000 0.334702 
96 960000 0.324516 
+1

Giả sử chúng tôi muốn khái quát hóa điều này để cung cấp cho chúng tôi 5 hàng gần nhất (khi chúng tôi có n yếu tố đầu vào và chúng tôi muốn đo sự gần gũi với n cột riêng biệt). Bạn vẫn làm theo cách này chứ? Nếu n = 2 (nói, x = 0,75, y = 5,0) - là dễ nhất để sử dụng "&" df.ix [(df.num1-x) .abs(). Argsort() [: 5] & (df.num2-y) .abs(). argsort() [: 5]]? Cảm ơn bạn! –

+1

Giao diện gấu trúc có thay đổi không? Tôi cần phải sử dụng 'df.iloc' thay vì' df.ix' nếu không thì các trường là tất cả 'NaN'. – swenzel

+1

Ah Tôi nghĩ rằng vấn đề là với chỉ số df của tôi, nó không phải là một chuỗi như 'phạm vi (len (df))'. 'iloc' tuy nhiên dường như hoạt động với cả chỉ số" bình thường "và chỉ mục của tôi. Tôi không có kinh nghiệm với gấu trúc nhưng hành vi này cho thấy rằng việc sử dụng 'iloc' sẽ ổn định hơn? – swenzel

3

Loại mới để trăn và gấu trúc nhưng tôi sẽ đề nghị này.

#make random df and get number 
df = pd.DataFrame({'c1':0,'c2':np.random.random(100)}) 
x = .25 
#find differences and sort 
diff = df.c2.apply(lambda z: abs(x-z)) 
diff.sort() 
#get the index for the 5 closest numbers 
inds = diff.index[:5] 

inds sau đó sẽ có vị trí chỉ mục từ df gốc cho 5 số gần nhất. Hi vọng điêu nay co ich!

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