Pythonic在数据框中的列中创建值对的方法

Pat*_*bug 3 python pandas

我有一个Dataframe看起来像这样:

OwnerID    Value
1            A
1            B
1            C
1            D
Run Code Online (Sandbox Code Playgroud)

这是缩短版本,我有数千个值OwnerID.我想为Value列创建对,其中每个对彼此Value配对Value,并将结果作为对列表.

例如,对于OwnerID1,结果集应该是以下列表:

[A,B]

[A,C]

[A,D]

[B,C]

[B,D]

[C,D]
Run Code Online (Sandbox Code Playgroud)

我可以编写2个for循环来实现这一点,但这不会非常有效或pythonic.有人知道更好的方法来实现这一目标吗?

任何帮助将非常感激.

Max*_*axU 5

Pandas解决方案(使用.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
Run Code Online (Sandbox Code Playgroud)

解:

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
Run Code Online (Sandbox Code Playgroud)

如果您只需要列表:

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)
Run Code Online (Sandbox Code Playgroud)