【问题标题】:From n x k DataFrame, generate a (n over 2) x 2k DataFrame of all pairs of rows从 n x k DataFrame,生成所有行对的 (n over 2) x 2k DataFrame
【发布时间】:2020-09-21 11:57:20
【问题描述】:

给定一个尺寸为 nxk 的 pandas DataFrame x,我们如何有效地生成一个尺寸为 (n over 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]]

【问题讨论】:

    标签: pandas numpy matrix reshape


    【解决方案1】:

    我们可以试试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]]
    

    【讨论】:

    • 您的意思可能是[*map(lambda x: sum(x,[]), itertools.combinations(x.values.tolist(),r=2))]?谢谢! :)
    【解决方案2】:

    我的尝试

    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)
    

    【讨论】:

      【解决方案3】:

      通过修改Bharath的回答here,我产生了一个解决方案:

      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 解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-10
        • 1970-01-01
        • 1970-01-01
        • 2011-03-08
        • 1970-01-01
        相关资源
        最近更新 更多