从 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 解决方案。
给定一个 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 解决方案。