【问题标题】:Merging two dataframes without creating suffix合并两个数据框而不创建后缀
【发布时间】:2020-03-31 16:48:51
【问题描述】:

我想通过合并两个单独的数据框来创建一个新的数据框。数据框共享一个公共键和一些公共列。此公共列还包含一些但不是全部相同的值。我想删除重复的值并保持两个值在每个单元格中都不同。我的数据如下所示:

左:

key1  valueZ  valueX  valueY
 A    bob     1       4
 B    jes     8       5
 C    joe     3       6

对:

key1  valueZ  valueX  valueY  valueK
 A    sam     7       4       hill town
 B    beth    8       11      market
 C    joe     9       12      mall

预期的输出是:

key1    valueZ     valueX     valueY   valueK 
A       bob/sam      1/7       4       hill town  
B       jes/beth     8         5/11    market       
C       joe          3/9       6/12    mall     

【问题讨论】:

    标签: python dataframe merge data-cleaning


    【解决方案1】:

    您需要通过几个步骤来完成此操作。

    这是我的设置供参考:

    import pandas as pd
    # define Data Frames
    left = pd.DataFrame({
        'key1': ['A', 'B', 'C'],
        'valueZ': ['bob', 'jes', 'joe'],
        'valueX': [1, 8, 3],
        'valueY': [4, 5, 6]
    })
    right = pd.DataFrame({
        'key1': ['A', 'B', 'C'],
        'valueZ': ['sam', 'beth', 'joe'],
        'valueX': [7, 8, 9],
        'valueY': [4, 11, 12],
        'valueK': ['hill town', 'market', 'mall']
    })
    

    现在我有两个 DataFrame 对象。它们是leftright,与您的示例相符。

    为了组合你想要的方式,我需要知道两个数据框之间哪些列是共同的,以及列的最终列表。为了便于配置,我还在这里定义了键列。你可以这样做:

    # determine important columns
    keyCol = 'key1'
    commonCols = list(set(left.columns & right.columns))
    finalCols = list(set(left.columns | right.columns))
    print('Common = ' + str(commonCols) + ', Final = ' + str(finalCols))
    

    这给出了:

    Common = ['valueZ', 'valueX', 'valueY', 'key1'], Final = ['valueZ', 'key1', 'valueK', 'valueX', 'valueY']

    接下来,您将照常加入两个数据框,但为两个数据框中的列添加后缀(此处的文档:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html

    # join dataframes with suffixes
    mergeDf = left.merge(right, how='left', on=keyCol, suffixes=('_left', '_right'))
    

    最后,您将使用所需的任何逻辑组合常用列。合并后,您可以从数据框中删除带后缀的列。下面的例子。您可以通过更有效的方式执行此操作,但为了清楚起见,我想将其分解。

    # combine the common columns
    for col in commonCols:
        if col != keyCol:
            for i, row in mergeDf.iterrows():
                leftVal = str(row[col + '_left'])
                rightVal = str(row[col + '_right'])
                print(leftVal + ',' + rightVal)
                if leftVal == rightVal:
                    mergeDf.loc[i, col] = leftVal
                else:
                    mergeDf.loc[i, col] = leftVal + '/' + rightVal
    
    # only use the finalCols
    mergeDf = mergeDf[finalCols]
    

    这给出了:

         valueZ key1     valueK valueX valueY
    0   bob/sam    A  hill town    1/7      4
    1  jes/beth    B     market      8   5/11
    2       joe    C       mall    3/9   6/12
    

    【讨论】:

    • 嘿内森,感谢详细的回答!不幸的是,当我尝试这种方法时,我最终得到了一个数据框,其中的值合并在一起,就好像它们不同一样。例如,ValueZ 是 (Joe/Joe) 而不是 (Joe)。另外我想合并索引(Key1)上的数据,因为这是两个数据帧的索引。谢谢
    • 啊,我使用 'A'、'B' 和 'C' 作为实际的 DataFrame 索引(而不是默认的 0、1、2 等)。听起来您希望它们出现在名为Key1 的列中。我可以为此更新。
    • 没错,Key1 在我的数据中实际上不是('A'、'B'、'C')。有价值的是其他信息。它是两个数据框中完全相同的列,因此我正在考虑将其作为合并其他不同列的索引。不确定这是否有意义
    • 为您编辑!
    猜你喜欢
    • 2018-09-04
    • 2018-08-25
    • 2017-05-06
    • 2019-03-29
    • 2020-01-01
    • 2017-11-13
    • 2017-09-08
    • 2019-11-29
    相关资源
    最近更新 更多