2016-02-18 51 views
2

可以說我有一個系列/數據幀A,看起來像與熊貓一起檢查2系列值對的最有效方法?

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已經存在。我想,我可以使用類似

for i in A: 
    for j in A: 
     s = A[i].astype(str) + '_' + A[j].astype(str) 
     B.append(pd.Series([s])) 

B創建的每一個元素,但我不知道如何確保第(i,j)的配對已經不存在,如確保2_3不得到添加,因爲我上面提到

什麼是最有效的方式來處理這個?

回答

4
from itertools import combinations 

s = pd.Series([1, 2, 3, 4]) 
s2 = pd.Series("_".join([str(a), str(b)]) for a, b in combinations(s, 2)) 

>>> s2 
0 1_2 
1 1_3 
2 1_4 
3 2_3 
4 2_4 
5 3_4 
dtype: object 
+0

我不明白這是如何解決問題的「不重複」部分,我必須說。 –

+0

注意有1_2但沒有2_1。這是什麼組合。 – Alexander

+0

但是,原始列表可能包含重複項,否? –

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'} 
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'

雖然導入itertools和使用組合是一個正確的方法來做到這一點,但如果我只需要一個或兩個東西,也可以通過直接方式輕鬆完成,我通常不希望導入庫。

相關問題