【问题标题】:How to merge two dataframes which are having duplicate values in the common column如何合并在公共列中具有重复值的两个数据框
【发布时间】:2021-02-18 03:32:39
【问题描述】:

我在必须与另一个合并的数据框的公共列中有重复值。 如何在不复制且不添加其他数据框中的列的情况下加入它们?


df_1:


df_2:

由于两个数据框中的列列表相同,如何将这两个数据框合并为一个数据框而不重复列?

预期的最终数据帧:

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    pandas.merge 将创建额外的列,因为它只是一个连接函数。您可以尝试使用 [combine_first][1] 将 df_1 与 df_2 更新为您的要求。这将匹配您的索引并替换其他数据框中的空值。

    df_1
    
        Id  Value_1 Value_2 Value_3
    0   A1  25.0    34.0    58.0
    1   B1  22.0    18.0    65.0
    2   C1  NaN     NaN     NaN
    3   C1  NaN     NaN     NaN
    4   C2  10.0    0.0     18.0
    5   D1  15.0    12.0    32.0
    
    df_2
    
        Id  Value_1 Value_2 Value_3
    0   C1  15      22      36
    1   C1  45     198      265
    
    Updated_df = (df_1.set_index('Id').combine_first(df_2.set_index('Id')).reset_index().reindex(columns=df_1.columns)).drop_duplicates()
    
    Updated_df
    
        Id  Value_1 Value_2 Value_3
    0   A1  25.0    34.0    58.0
    1   B1  22.0    18.0    65.0
    2   C1  15.0    22.0    36.0
    3   C1  45.0    198.0   265.0
    6   C2  10.0    0.0     18.0
    7   D1  15.0    12.0    32.0
    
    

    【讨论】:

      【解决方案2】:

      创建第一个数据框:

      import pandas as pd
      df_1 = pd.DataFrame({'Value_1': [25, 22, None, None, 10, 15],
                          'Value_2': [34, 18, None, None, 0,  12],
                          'Value_3': [58, 65, None, None, 18, 32]}
                          , index = ['A1', 'B1', 'C1', 'C1', 'C2', 'D1'])
      print(df_1)
      

      输出:

          Value_1  Value_2  Value_3
      A1     25.0     34.0     58.0
      B1     22.0     18.0     65.0
      C1      NaN      NaN      NaN
      C1      NaN      NaN      NaN
      C2     10.0      0.0     18.0
      D1     15.0     12.0     32.0
      

      创建第二个数据框:

      df_2 = pd.DataFrame({'Value_1': [15, 45],
                          'Value_2': [22, 198],
                          'Value_3': [36, 265]}
                          , index = ['C1', 'C1'])
      print(df_2)
      

      输出:

          Value_1  Value_2  Value_3
      C1       15       22       36
      C1       45      198      265
              
      

      您可以将 df_1 与 df_2 中的新行连接起来。然后用 df_2 中的值更新值。

      df = pd.concat([df_1[~df_1.index.isin(df_2.index)], df_2])
      print(df)
      

      输出:

          Value_1  Value_2  Value_3
      A1     25.0     34.0     58.0
      B1     22.0     18.0     65.0
      C2     10.0      0.0     18.0
      D1     15.0     12.0     32.0
      C1     15.0     22.0     36.0
      C1     45.0    198.0    265.0
      

      【讨论】:

        猜你喜欢
        • 2023-01-12
        • 1970-01-01
        • 2017-09-03
        • 1970-01-01
        • 2016-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多