代码之家  ›  专栏  ›  技术社区  ›  cookiemonster

如何将两个数据帧(具有相同的列/行)转换为元组的数据帧?

  •  1
  • cookiemonster  · 技术社区  · 4 年前

    如何转换两个数据帧,例如:

    df1=pd.DataFrame({'A': [1, 2,3], 'B': [10, 20,30]})
    df2=pd.DataFrame({'A': [11, 22,33], 'B': [110, 220, 330]})
    

         A       B
    0   (1, 11) (10, 110)
    1   (2, 22) (20, 220)
    2   (3, 33) (30, 330)
    

    我试图找到一个pandas函数,而不是使用循环。这只是一个虚拟示例,原始数据帧有许多列

    4 回复  |  直到 4 年前
        1
  •  2
  •   Code Different    4 年前

    你可以用 pd.join :

    df1.join(df2, lsuffix='1', rsuffix='2').apply(tuple, axis=1).to_frame('A')
    
        2
  •  0
  •   Ben.T    4 年前

    你可以 concat groupby.agg 在索引上。使用此方法将对齐列和列 groupby

    print(pd.concat([df1, df2]).groupby(level=0).agg(tuple)) 
             A
    0  (1, 11)
    1  (2, 22)
    2  (3, 32)
    

    也就是说,在这种特定情况下,使用列表理解可能更快

    pd.DataFrame({'A':[(a1, a2) for a1, a2 in zip(df1['A'], df2['A'])]})
    
        3
  •  0
  •   Rodalm    4 年前

    df = pd.DataFrame({"A": zip(df1.A, df2.A)})
    

    比其他解决方案更快、更简单

    def repeat_df(df, n):
        return pd.concat([df]*n, ignore_index=True)
    
    n = 1000
    
    df1 = pd.DataFrame({'A': [1, 2, 3]})
    df2 = pd.DataFrame({'A': [11, 22, 32]})
    
    df1 = repeat_df(df1, n)
    df2 = repeat_df(df2, n)
    
    >>> %timeit df1.join(df2, lsuffix='1', rsuffix='2').apply(tuple, axis=1).to_frame('A')
    
    36.6 ms ± 1.43 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    >>> %timeit pd.concat([df1, df2]).groupby(level=0).agg(tuple)
    
    39.8 ms ± 3.05 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    >>> %timeit pd.DataFrame({"A": zip(df1.A, df2.A)})
    
    1.95 ms ± 135 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    

    编辑

    上述解很容易推广

    df = pd.DataFrame({col: zip(df1[col], df2[col]) for col in df1.columns})
    

    >>> %timeit pd.concat([df1, df2]).groupby(level=0).agg(tuple)
    
    70.3 ms ± 1.66 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    >>> %timeit pd.DataFrame({col: zip(df1[col], df2[col]) for col in df1.columns})
    
    3.41 ms ± 389 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
        4
  •  -1
  •   vivekpadia70    4 年前

    你可以用熊猫 pd.itertuples 用于在合并两个数据帧后将数据帧转换为元组。

    df = pd.concat([df1, df2])
    tuples = df.itertuples()