2015-05-07 20 views
10

ho visto:Come trovare i valori più vicini in una serie di Pandas a un numero di input?

Questi si riferiscono al pitone vaniglia e non ai panda.

Se ho la serie:

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

E io ingresso 3, come posso (efficiente) trovare?

  1. L'indice di 3 se si trova nella serie
  2. L'indice del valore sotto e sopra 3 se non si trova nella serie.

Ie. Con la serie precedente {1,6,4,5,2} e l'input 3, dovrei ottenere valori (4,2) con indici (2,4).

risposta

12

Si potrebbe usare come argsort()

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 è la dataframe con 2 valori più vicini.

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

Per indice,

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

Per valori,

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

dettaglio, per la soluzione sopra df era

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

questo trova il più vicino e sopra, o solo i due più vicini? – Steve

+0

Cosa intendi per sotto e sopra? I valori più vicini sono scelti dalla differenza assoluta tra loro e l'input dato. – Zero

+0

Avevo bisogno di trovare a) il numero più cloest sopra, b) il numero più vicino qui sotto. Quindi la differenza assoluta non raggiungerebbe questo in tutti i casi. – Steve

4

Mi consiglia di utilizzare iloc in aggiunta alla risposta di John Galt dal momento che questo funzionerà anche con indice intero indifferenziati, poiché .ix prima esamina l'indice etichette

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

Se la serie è già ordinato, si potrebbe usare qualcosa di simile.

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. 
Problemi correlati