代码之家  ›  专栏  ›  技术社区  ›  Khalil Al Hooti

基于grouby将数据从一个数据帧映射到另一个数据帧

  •  0
  • Khalil Al Hooti  · 技术社区  · 6 年前

    可能以前也有人问过类似的问题,但我找不到人来解决我的问题。也许我没有使用正确的搜索词!。

    import pandas as pd
    import numpy as np
    

    a = np.array([1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3])
    b = np.array([1,1,2,2,3,3,1,1,2,2,3,3,1,1,2,2,3,3])
    df1 = pd.DataFrame({'a':a, 'b':b})
    print(df1)
    
        a   b
    0   1   1
    1   1   1
    2   1   2
    3   1   2
    4   1   3
    5   1   3
    6   2   1
    7   2   1
    8   2   2
    9   2   2
    10  2   3
    11  2   3
    12  3   1
    13  3   1
    14  3   2
    15  3   2
    16  3   3
    17  3   3
    

    df2如下:

    a2 = np.array([1,1,1,2,2,2,3,3,3])
    b2 = np.array([1,2,3,1,2,3,1,2,3])
    c = np.array([4,8,3,np.nan, 2, 5,6, np.nan, 1])
    
    df2 = pd.DataFrame({'a':a2, 'b':b2, 'c': c})
    
    a   b   c
    0   1   1   4.0
    1   1   2   8.0
    2   1   3   3.0
    3   2   1   NaN
    4   2   2   2.0
    5   2   3   5.0
    6   3   1   6.0
    7   3   2   NaN
    8   3   3   1.0
    

    现在我想将c列从df2映射到df1,但保留a=a1和b=b2列的分组。因此,如下所示修改df1

    a   b  c
        0   1   1  4
        1   1   1  4
        2   1   2  8
        3   1   2  8
        4   1   3  3
        5   1   3  3
        6   2   1  NaN
        7   2   1  NaN
        8   2   2  2.0
        9   2   2  2.0
        10  2   3  5.0
        11  2   3  5.0
        12  3   1  6.0
        13  3   1  6.0
        14  3   2  NaN
        15  3   2  NaN
        16  3   3  1.0
        17  3   3  1.0
    

    如何用简单直观的方式使用熊猫来实现这一点?

    1 回复  |  直到 6 年前
        1
  •  3
  •   sacuL    6 年前

    使用起来很简单 merge :

    df1.merge(df2)
    
        a  b    c
    0   1  1  4.0
    1   1  1  4.0
    2   1  2  8.0
    3   1  2  8.0
    4   1  3  3.0
    5   1  3  3.0
    6   2  1  NaN
    7   2  1  NaN
    8   2  2  2.0
    9   2  2  2.0
    10  2  3  5.0
    11  2  3  5.0
    12  3  1  6.0
    13  3  1  6.0
    14  3  2  NaN
    15  3  2  NaN
    16  3  3  1.0
    17  3  3  1.0
    

    如果您有更多的列,并且只希望在 a b ,使用:

    df1.merge(df2, on=['a','b'])