2017-02-21 105 views
3

創建對值一列Python化的方式,我有一個Dataframe,看起來像這樣:在數據幀

OwnerID Value 
1   A 
1   B 
1   C 
1   D 

這是縮短的版本,我有成千上萬值的OwnerID。我想爲Value列創建配對,其中每個Value與其他每個Value配對,並將結果作爲配對列表。

例如,對於OwnerID 1,結果集應該是以下列表:

[A,B] 

[A,C] 

[A,D] 

[B,C] 

[B,D] 

[C,D] 

我可以寫2個for循環來實現這一點,但不會是非常有效或Python的。有人會知道更好的方法來實現這一目標嗎?

任何幫助將不勝感激。

+0

@ B.Eckles是啊,只注意到。我的錯。 – spicypumpkin

+0

@Posh_Pumpkin哈哈我只是注意到你注意到了。 ; D –

回答

4
import itertools as iter 
df2 = df.groupby('OwnerID').Value.apply(lambda x: list(iter.combinations(x, 2))) 

將返回所希望的輸出爲每個唯一的所有者ID

OwnerID 
1 [(A, B), (A, C), (A, D), (B, C), (B, D), (C, D)] 
+1

@Patthebug,我只是編輯答案照顧每個獨特的業主身份證 – Vaishali

+0

非常好的解決方案! – MaxU

+0

@VaishaliGarg感謝您的回答。 – Patthebug

0

試itertools

import itertools 

list(itertools.combinations(['a','b','c','d'], 2)) 

#result: [('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')] 
0
val = df['Value'].values 
length = len(val) 
pairs = [[val[i],val[j]] for i in xrange(length) for j in xrange(length) if i!=j] 
5

熊貓溶液(使用.merge().query()方法):

數據:

In [10]: df 
Out[10]: 
    OwnerID Value 
0  1  A 
1  1  B 
2  1  C 
3  1  D 
4  2  X 
5  2  Y 
6  2  Z 

解決方案:

In [9]: pd.merge(df, df, on='OwnerID', suffixes=['','2']).query("Value != Value2") 
Out[9]: 
    OwnerID Value Value2 
1   1  A  B 
2   1  A  C 
3   1  A  D 
4   1  B  A 
6   1  B  C 
7   1  B  D 
8   1  C  A 
9   1  C  B 
11  1  C  D 
12  1  D  A 
13  1  D  B 
14  1  D  C 
17  2  X  Y 
18  2  X  Z 
19  2  Y  X 
21  2  Y  Z 
22  2  Z  X 
23  2  Z  Y 

如果您只需要列出:

In [17]: pd.merge(df, df, on='OwnerID', suffixes=['','2']) \ 
      .query("Value != Value2") \ 
      .filter(like='Value').values 
Out[17]: 
array([['A', 'B'], 
     ['A', 'C'], 
     ['A', 'D'], 
     ['B', 'A'], 
     ['B', 'C'], 
     ['B', 'D'], 
     ['C', 'A'], 
     ['C', 'B'], 
     ['C', 'D'], 
     ['D', 'A'], 
     ['D', 'B'], 
     ['D', 'C'], 
     ['X', 'Y'], 
     ['X', 'Z'], 
     ['Y', 'X'], 
     ['Y', 'Z'], 
     ['Z', 'X'], 
     ['Z', 'Y']], dtype=object) 
+0

。查詢是由熊貓提供的?簡直不敢相信我錯過了這麼棒的方法! – AsheKetchum

+1

@AsheKetchum,是的,我添加了一個鏈接到文檔 – MaxU