在Pandas中使用索引找到两个序列之间的交集

10

我有两个不同长度的系列,并尝试根据索引(索引是字符串)找到两个系列的交集。最终结果是,希望得到一个基于共同字符串索引的元素交集的系列。

有什么想法吗?

2个回答

13

Pandas索引具有一个交集方法,您可以使用它。如果您有两个Series:s1s2,则

s1.index.intersection(s2.index)

或者,等价地说:

s1.index & s2.index

给出同时在s1s2中的索引值。

之后您可以使用这个索引列表来查看系列中对应的元素。例如:

>>> ixs = s1.index.intersection(s2.index)
>>> s1.loc[ixs]
# subset of s1 with only the indexes also found in s2 appears here

不错,但它只给我索引,没有带数值的序列。 - Boss1295
1
@Boss1295 看起来你的两个Series没有任何共同的索引值。如果你尝试使用 s1 = pd.Series(range(3))s2 = pd.Series(range(3), index=[5, 0, 2]),你应该会看到该方法按预期工作。 - Alex Riley
索引是字符串,它在这些条件下仍然有效吗? - Boss1295
ajcr的方法本应有效,如果无效,则说明您没有共同的值。 - EdChum
2
s1.index和s2.index执行类似的任务。 - seongjoo
显示剩余4条评论

0

由于我的数据都是递增的,所以我编写了一个函数来获取它们的索引,然后根据这些索引过滤数据。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接