使用Pandas检查2系列值的最有效方法?

时间:2016-02-18 21:49:27

标签: python pandas

假设我有一个看起来像

的系列/数据框A
A = [3,2,1,5,4,...

A也可以排序,因为它对我无关紧要。我想创建一个跟踪可能对的新系列。也就是说,我希望结果看起来像

B = [3_1, 3_2, 3_4, ..., 2_1, 2_4, ..., 1_4, 1_5,...

也就是说,我想排除2_3,因为3_2已经存在。我想我可以使用像

这样的东西在B中创建每个元素
for i in A:
    for j in A:
        s = A[i].astype(str) + '_' + A[j].astype(str)
        B.append(pd.Series([s]))

但我不确定如何确保(i,j)配对尚不存在,例如确保{I}没有添加,如上所述

处理此问题的最有效方法是什么?

3 个答案:

答案 0 :(得分:4)

a1.equalityIntersect(a2) == [[2], [3]]

答案 1 :(得分:2)

我不认为这与大熊猫有很大关系,除了系列中的原始值(可能结束)。相反,我会使用itertools

假设您有一个可迭代a的值。然后

import itertools

set((str(i) + '_' + str(j)) for (i, j) in itertools.product(a, a) if i <= j)

将创建一组对,其中_之前的整数不大于此之后的整数,从而删除重复项。

示例

import itertools

>>> set((str(i) + '_' + str(j)) for (i, j) in itertools.product(a, a) if i < j)
{'1_2',
 '1_3',
 '1_4',
 '1_6',
 '1_7',
 '2_3',
 '2_4',
 '2_6',
 '2_7',
 '3_4',
 '3_6',
 '3_7',
 '4_6',
 '4_7',
 '6_7'}

答案 2 :(得分:0)

这可以通过列表理解来完成:

>>> a = [3, 2, 1, 5, 4]
>>> [(str(x)+'_'+str(y)) for x in a for y in a if y>x]
['3_5', '3_4', '2_3', '2_5', '2_4', '1_3', '1_2', '1_5', '1_4', '4_5']

请注意,由于y>x语句对结果中成对成员的排序进行了排序,这就是我们输出中'1_3'而不是'3_1'的原因。< / p>

虽然导入itertools和使用组合是一种正确的方法,但我通常不想导入库,如果我只需要一两个东西,也可以通过直接手段轻松完成。