2017-06-29 1 views
1

Ich habe einen Datenrahmen wie folgt aus:Wie wählt man die Elemente basierend auf einer Liste in numpy Array?

array([[1374495, 3, 'prior', ..., 16.0, 'soy lactosefree', 'dairy eggs'], 
     [3002854, 3, 'prior', ..., 16.0, 'soy lactosefree', 'dairy eggs'], 
     [2710558, 3, 'prior', ..., 16.0, 'soy lactosefree', 'dairy eggs'], 
     ..., 
     [1355976, 206200, 'prior', ..., 16.0, 'soy lactosefree', 
     'dairy eggs'], 
     [1909878, 206200, 'prior', ..., 16.0, 'soy lactosefree', 
     'dairy eggs'], 
     [943915, 206200, 'train', ..., 16.0, 'soy lactosefree', 'dairy eggs']], dtype=object) 

die erste Zahl jeder Zeile orderid wird, wie 1374495, 3002854, 2710558... Jetzt habe ich eine Liste von orderid haben, die verwendet werden sollen die Zeilen aus dem Array zu erhalten. Zum Beispiel ist die zu verwendende Liste [1355976, 1909878, 943915 ], ich sollte die Zeilen aus dem Array auswählen, deren Bestell-ID [1355976, 1909878, 943915 ] ist. Wie kann ich das effizient umsetzen?

Antwort

1

Ansatz # 1

Hier ist ein Ansatz, der auf np.searchsorted -

def filter_rows(a, idx): 
    # a is input dataframe as array 
    # idx is list of indices for selecting rows 

    a_idx = a[:,0] 
    idx_arr = np.sort(idx) 
    pos_idx = np.searchsorted(idx_arr, a_idx) 
    pos_idx[pos_idx == idx_arr.size] = 0 
    mask = idx_arr[pos_idx] == a_idx 
    out = a[mask] 
    return out 

Ansatz # 2

Hier ist eine andere mit np.in1d -

a[np.in1d(a[:,0], idx)] 

Beispielläufe -

In [83]: a 
Out[83]: 
array([[1374495, 3, 'prior', 16.0, 'soy lactosefree', 'dairy eggs'], 
     [3002854, 3, 'prior', 16.0, 'soy lactosefree', 'dairy eggs'], 
     [2710558, 3, 'prior', 16.0, 'soy lactosefree', 'dairy eggs'], 
     [1355976, 206200, 'prior', 16.0, 'soy lactosefree', 'dairy eggs'], 
     [1909878, 206200, 'prior', 16.0, 'soy lactosefree', 'dairy eggs'], 
     [943915, 206200, 'train', 16.0, 'soy lactosefree', 'dairy eggs']]) 

In [84]: idx 
Out[84]: [1355976, 1909878, 943915] 

In [85]: filter_rows(a, idx) 
Out[85]: 
array([[1355976, 206200, 'prior', 16.0, 'soy lactosefree', 'dairy eggs'], 
     [1909878, 206200, 'prior', 16.0, 'soy lactosefree', 'dairy eggs'], 
     [943915, 206200, 'train', 16.0, 'soy lactosefree', 'dairy eggs']]) 

In [88]: a[np.in1d(a[:,0], idx)] 
Out[88]: 
array([[1355976, 206200, 'prior', 16.0, 'soy lactosefree', 'dairy eggs'], 
     [1909878, 206200, 'prior', 16.0, 'soy lactosefree', 'dairy eggs'], 
     [943915, 206200, 'train', 16.0, 'soy lactosefree', 'dairy eggs']]) 
0

Das numpy_indexed Paket (Disclaimer: Ich bin sein Autor) für diese Art von Operationen effiziente Funktionalität enthält:

import numpy_indexed as npi 
row_idx = npi.indices(id_column, ids_to_get_index_of) 

Sollte die gleiche Leistung wie die Lösung von Divakar angeboten haben , aber kommt mit einigen zusätzlichen Schnickschnack, wie Kwargs, um verschiedene Möglichkeiten zu wählen, mit fehlenden Werten umzugehen, und so weiter.

Verwandte Themen