Поиск пересечения между двумя сериями в Pandas с помощью индекса

У меня есть две серии разной длины, и я пытаюсь найти пересечение двух серий на основе индекса, где индекс является строкой. Мы надеемся, что конечный результат - это серия, в которой элементы пересечения основаны на общих строковых индексах.

Любые идеи?


person Boss1295    schedule 12.10.2014    source источник


Ответы (2)


В индексах Pandas есть метод пересечения, который вы можете использовать. Если у вас две серии, s1 и s2, тогда

s1.index.intersection(s2.index)

или, что то же самое:

s1.index & s2.index

дает вам значения индекса, которые находятся как в s1, так и в s2.

Затем вы можете использовать этот список индексов для просмотра соответствующих элементов серии. Например:

>>> ixs = s1.index.intersection(s2.index)
>>> s1.loc[ixs]
# subset of s1 with only the indexes also found in s2 appears here
person Alex Riley    schedule 12.10.2014
comment
Хорошо, но он дает мне только индексы, а не серию со значениями. - person Boss1295; 12.10.2014
comment
Я попробовал функцию, присвоив ее переменной, но она мне ничего не дала. Уверен, что общие элементы есть, но пока нет. - person Boss1295; 12.10.2014
comment
Пробовал common = s1.index.intersection (s2.index); печать len (common) дает 0. - person Boss1295; 12.10.2014
comment
@ Boss1295 Похоже, у вас нет общих значений индекса в двух ваших сериях. Если вы попробуете, скажем, s1 = pd.Series(range(3)) и s2 = pd.Series(range(3), index=[5, 0, 2]), вы увидите, что метод работает должным образом. - person Alex Riley; 12.10.2014
comment
Индексы строковые, работает ли он в этих условиях? - person Boss1295; 12.10.2014
comment
Метод ajcr должен был сработать, в противном случае у вас нет общих значений - person EdChum; 12.10.2014
comment
Спасибо, ребята, я собираюсь просмотреть и убедиться, что общих элементов нет (хотя есть ~ 450 элементов), но я предполагаю, что общих элементов нет. - person Boss1295; 12.10.2014
comment
s1.index & s2.index выполняет аналогичную работу. - person seongjoo; 17.09.2015
comment
Возможно, вам придется использовать iloc (т.е. s1.iloc[ixs]), если тип индекса - int (для всех, кто сталкивается с той же проблемой, что и я) - person Ryan Biwer; 01.06.2018

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

np.shape(data1)  # (1330, 8)
np.shape(data2)  # (2490, 9)
index_1, index_2 = overlap(data1, data2)
data1 = data1[index1]
data2 = data2[index2]
np.shape(data1)  # (540, 8)
np.shape(data2)  # (540, 9)
def overlap(data1, data2):
    '''both data is assumed to be incrementing'''
    mask1 = np.array([False] * len(data1))
    mask2 = np.array([False] * len(data2))
    idx_1 = 0
    idx_2 = 0
    while idx_1 < len(data1) and idx_2 < len(data2):
        if data1[idx_1] < data2[idx_2]:
            mask1[idx_1] = False
            mask2[idx_2] = False
            idx_1 += 1
        elif data1[idx_1] > data2[idx_2]:
            mask1[idx_1] = False
            mask2[idx_2] = False
            idx_2 += 1
        else:
            mask1[idx_1] = True
            mask2[idx_2] = True
            idx_1 += 1
            idx_2 += 1
    return mask1, mask2
person nurp    schedule 16.01.2018