从 n x k DataFrame,生成一个 (n over 2) x 2k DataFrame 的所有行对

From n x k DataFrame, generate a (n over 2) x 2k DataFrame of all pairs of rows

给定一个 pandas 维度为 n x k 的 DataFrame x,我们如何有效地 生成维度为(n 超过 2)x 2k 的 DataFrame y,其行都是来自 x 的行对行的可能组合? 例如,如果 x 是

[[1 11],
 [2,22],
 [3,33],
 [4,44]]

那么y应该是

[[1,11,2,22],
 [1,11,3,33],
 [1,11,4,44],
 [2,22,3,33],
 [2,22,4,44],
 [3,33,4,44]]

我们可以试试combinations

from itertools import combinations
[*map(lambda x : sum(x,[]),combinations(l,r=2))]
Out[80]: 
[[1, 11, 2, 22],
 [1, 11, 3, 33],
 [1, 11, 4, 44],
 [2, 22, 3, 33],
 [2, 22, 4, 44],
 [3, 33, 4, 44]]

我的尝试

l=[[1,11], [2,22], [3,33], [4,44]]

完整列表

#lst=[x+y for x in [z for z in l[:3]] for y in [z for z in l[1:]] if x!=y]#Use + in list comprehension

如果你想消除[3, 33, 2, 22]。初始化一个新的 list 并仅在 y+x 不存在时附加 x+y

k=[]
lst=[k.append(x+y) for x in [z for z in l[:3]] for y in [z for z in l[1:]] if x!=y if y+x not in k]
print(k)

通过修改 Bharath 的答案 ,我得出了一个解决方案:

n=4; x=pandas.DataFrame([[i,11*i] for i in range(1,n+1)],columns=['A','B'])
cnct=( lambda l,i=0: pandas.concat(l,axis=i) )
z=cnct([ cnct([x.iloc[:i] for i in range(n)]).sort_index().reset_index(drop=True), 
         cnct([x.iloc[i+1:] for i in range(n)]).reset_index(drop=True) ], 1)

对于 n=10**4,它优于 itertools 解决方案。