2015-05-07 10 views
10

widziałem:Jak znaleźć najbliższe wartości z serii Pandas w liczbie wejściowej?

Dotyczą one wanilii Pythona, a nie pandy.

Jeśli mam serie:

ix num 
0 1 
1 6 
2 4 
3 5 
4 2 

I wejście 3, jak mogę (efektywnie) znaleźć?

  1. Indeks 3, jeśli ona znajduje się w cyklu
  2. Wskaźnik wartości powyżej i poniżej 3, jeśli nie znajduje się w serii.

Tzn. W powyższej serii {1,6,4,5,2} i wprowadzeniu 3 powinienem uzyskać wartości (4,2) z indeksami (2,4).

Odpowiedz

12

Można użyć argsort() jak

Say, input = 3

In [198]: input = 3 

In [199]: df.ix[(df['num']-input).abs().argsort()[:2]] 
Out[199]: 
    num 
2 4 
4 2 

df_sort jest dataframe 2 najbliższymi wartościami.

In [200]: df_sort = df.ix[(df['num']-input).abs().argsort()[:2]] 

dla indeksu,

In [201]: df_sort.index.tolist() 
Out[201]: [2, 4] 

Dla wartości

In [202]: df_sort['num'].tolist() 
Out[202]: [4, 2] 

Szczegółowo, do powyższego roztworu df był

In [197]: df 
Out[197]: 
    num 
0 1 
1 6 
2 4 
3 5 
4 2 
+1

Czy znajduje się najbliższy poniżej i powyżej lub tylko dwa najbliższe? – Steve

+0

Co masz na myśli mówiąc poniżej i powyżej? Najbliższe wartości są wybierane przez bezwzględną różnicę między nimi a danym wejściem. – Zero

+0

Potrzebowałem znaleźć a) najniżej położoną liczbę powyżej, b) najbliższą liczbę poniżej. Tak więc różnica absolutna nie doprowadziłaby do tego we wszystkich przypadkach. – Steve

4

polecam korzystania iloc oprócz odpowiedzi John Galt od czasu to będzie działać nawet z niesegregowanych indeksu całkowitą, ponieważ .ix pierwsze wygląda na indeksie etykiet

df.iloc[(df['num']-input).abs().argsort()[:2]] 
0

Jeśli seria jest już posortowane, można użyć coś takiego.

def closest(df, col, val, direction): 
    n = len(df[df[col] <= val]) 
    if(direction < 0): 
     n -= 1 
    if(n < 0 or n >= len(df)): 
     print('err - value outside range') 
     return None 
    return df.ix[n, col]  

df = pd.DataFrame(pd.Series(range(0,10,2)), columns=['num']) 
for find in range(-1, 2): 
    lc = closest(df, 'num', find, -1) 
    hc = closest(df, 'num', find, 1) 
    print('Closest to {} is {}, lower and {}, higher.'.format(find, lc, hc)) 


df:  num 
    0 0 
    1 2 
    2 4 
    3 6 
    4 8 
err - value outside range 
Closest to -1 is None, lower and 0, higher. 
Closest to 0 is 0, lower and 2, higher. 
Closest to 1 is 0, lower and 2, higher. 
Powiązane problemy