【问题标题】:Merging two Pandas dataframes based column values合并两个基于 Pandas 数据框的列值
【发布时间】:2022-01-24 13:52:11
【问题描述】:

我有两个数据框定义如下:

dataframe1 = pd.DataFrame( [["123", "CTR", "ABC", "DEF", "GHI"],
                            ["123", "RIGHT", "ABC", "DEF", "GHI"],
                            ["123", "LEFT", "ABC", "DEF", "GHI"],
                            ["456", "CTR", "JKL", "MNO", "PQR"],
                            ["456", "RIGHT", "JKL", "MNO", "PQR"],
                            ["456", "LEFT", "JKL", "MNO", "PQR"]],
    columns=["ID","LOCATION",
            "Attr1", "Attr2", "Attr3"],
    )

dataframe2 = pd.DataFrame( [["1", "A", "123"],
                            ["1", "B", "123"],
                            ["1", "C", "123"],
                            ["2", "A", "456"],
                            ["2", "B", "456"],
                            ["2", "C", "456"]],
    columns=["ROW","LOCATION","ID"],
    )

我想根据 ID 列和 Location 列的值将这两个数据框合并为一个数据框。在位置列中,A 等于 CTR,B 等于 RIGHT,C 等于 LEFT。我正在寻找的结果是这样的:

    ID ROW LOCATION Attr1 Attr2 Attr3
0  123   1        A   ABC   DEF   GHI
1  123   1        B   ABC   DEF   GHI
2  123   1        C   ABC   DEF   GHI
3  456   2        A   JKL   MNO   PQR
4  456   2        B   JKL   MNO   PQR
5  456   2        C   JKL   MNO   PQR

使用 pandas.merge() 我可以使用一列或多列合并数据帧,但由于位置列值不匹配,我得到一个 KeyError。

pandas.merge() 是正确的函数吗?如何使用它定义匹配的列值?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    mapassign 使用字典的值,然后你可以执行一个简单的merge

    d = {'CTR': 'A', 'RIGHT': 'B', 'LEFT': 'C'}
    
    dataframe2.merge(dataframe1.assign(LOCATION=dataframe1['LOCATION'].map(d)),
                     on=['ID', 'LOCATION'])
    

    输出:

      ROW LOCATION   ID Attr1 Attr2 Attr3
    0   1        A  123   ABC   DEF   GHI
    1   1        B  123   ABC   DEF   GHI
    2   1        C  123   ABC   DEF   GHI
    3   2        A  456   JKL   MNO   PQR
    4   2        B  456   JKL   MNO   PQR
    5   2        C  456   JKL   MNO   PQR
    

    【讨论】:

      【解决方案2】:

      只需将其映射到位置字典,您想要的和 dataframe2 之间没有关系:

      locations = { 'CTR':'A' , 'RIGHT' : 'B', 'LEFT' : 'C'}
      dataframe1['LOCATION'] = dataframe1['LOCATION'].map(locations)
      
      print(dataframe1)
      

      【讨论】:

        猜你喜欢
        • 2019-05-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 2018-01-30
        • 1970-01-01
        • 1970-01-01
        • 2019-12-16
        • 1970-01-01
        相关资源
        最近更新 更多