2017-02-21 56 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