2017-02-03 15 views
4

Функция MATCH в excel позволяет задать необязательный набор параметров, который будет возвращать либо наибольшее значение меньше заданного значения, либо самое меньшее значение, превышающее заданное значение.Как эффективно выполнить эквивалент функции MATCH Excel (меньше) в Pandas?

Предположим, у меня есть DataFrame, x.

In [1]: x = pd.DataFrame(data=list(range(0, 11)), columns=["Obs"]) 

In [2]: x 
Out[2]: 
    Obs 
0  0 
1  1 
2  2 
3  3 
4  4 
5  5 
6  6 
7  7 
8  8 
9  9 
10 10 

И dataframe, y.

In [3]: y = pd.DataFrame(data=[(-1, "Small"), (4, "Medium"), (7, "Large")], 
         columns=["Obs", "Cat"]) 

In [4]: y 
Out[4]: 
Obs  Cat 
0 -1 Small 
1 4 Medium 
2 7 Large 

Как я могу сделать INDEX-MATCH с тип_сопоставления 1, означает, что она будет проходить через каждое из значений в Obs, и возвращает значение из «Cat», что соответствует «набл», который является наибольшим значением, которое меньше и равно поиску?

Обратите внимание, что я хотел бы сделать это определенным образом и НЕ писать пользовательскую функцию и прокручивать строки второго DataFrame. Это было бы довольно неэффективно.

ответ

3

IIUC, вы хотите pd.merge_asof

pd.merge_asof(x, y) 
+0

или прибегнуть к pd.merge, если вы с помощью версия панд ниже 0.19.0 – Amorpheuses

1

Другой подход с cut, менее компактным, но это дает вам заказали категоричен бесплатно:

pd.cut(x.Obs, y.Obs.tolist()+[np.inf], labels=y.Cat) 
Out[362]: 
0  Small 
1  Small 
2  Small 
3  Small 
4  Small 
5  Medium 
6  Medium 
7  Medium 
8  Large 
9  Large 
10  Large 
Name: Obs, dtype: category 
Categories (3, object): [Small < Medium < Large]