我有一个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.有人知道更好的方法来实现这一目标吗?
任何帮助将非常感激.
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)
| 归档时间: |
|
| 查看次数: |
671 次 |
| 最近记录: |