我有一个看起来像这样的 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
循环来实现这一点,但这不会非常有效或 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
解决方法:
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)
关于在数据框中的列中创建值对的 Pythonic 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42375225/