【问题标题】:Merge multiple dataframe pandas合并多个数据框熊猫
【发布时间】:2018-06-30 13:14:48
【问题描述】:

我尝试将多个新数据帧合并到一个主数据帧中。 假设主数据框:

      key1           key2
0   0.365803    0.259112
1   0.086869    0.589834
2   0.269619    0.183644
3   0.755826    0.045187
4   0.204009    0.669371

我尝试将以下 2 个数据集合并到主数据集中,
新数据1:

        key1    key2    new feature
0   0.365803    0.259112    info1

新数据2:

        key1    key2    new feature
0   0.204009    0.669371    info2

预期结果:

       key1       key2  new feature
0   0.365803    0.259112    info1
1   0.776945    0.780978    NaN
2   0.275891    0.114998    NaN
3   0.667057    0.373029    NaN
4   0.204009    0.669371    info2

我尝试了什么:

test = test.merge(data1, left_on=['key1', 'key2'], right_on=['key1', 'key2'], how='left')
test = test.merge(data2, left_on=['key1', 'key2'], right_on=['key1', 'key2'], how='left')

第一个效果很好,但第二个效果不好,我得到的结果:

        key1    key2    new feature_x   new feature_y
0   0.365803    0.259112    info1      NaN
1   0.776945    0.780978    NaN        NaN
2   0.275891    0.114998    NaN        NaN
3   0.667057    0.373029    NaN        NaN
4   0.204009    0.669371    NaN       info2

感谢您的帮助!

【问题讨论】:

    标签: python pandas merge


    【解决方案1】:

    首先appendconcat 两个DataFrames 一起,然后merge

    dat = pd.concat([data1, data2], ignore_index=True)
    

    或者:

    dat = data1.append(data2, ignore_index=True)
    
    print (dat)
           key1      key2 new feature
    0  0.365803  0.259112       info1
    1  0.204009  0.669371       info2
    

    #if same joined columns names better is only on parameter
    df = test.merge(dat, on=['key1', 'key2'], how='left')
    
    print (df)
           key1      key2 new feature
    0  0.365803  0.259112       info1
    1  0.086869  0.589834         NaN
    2  0.269619  0.183644         NaN
    3  0.755826  0.045187         NaN
    4  0.204009  0.669371       info2
    

    【讨论】:

      【解决方案2】:

      您可以改用pd.DataFrame.update

      # create new column and set index
      res = test.assign(newfeature=None).set_index(['key1', 'key2'])
      
      # update with new data sequentially
      res.update(data1.set_index(['key1', 'key2']))
      res.update(data2.set_index(['key1', 'key2']))
      
      # reset index to recover columns
      res = res.reset_index()
      
      print(res)
      
             key1      key2 newfeature
      0  0.365803  0.259112      info1
      1  0.086869  0.589834       None
      2  0.269619  0.183644       None
      3  0.755826  0.045187       None
      4  0.204009  0.669371      info2
      

      【讨论】:

        【解决方案3】:

        您也可以将数据框设置为相同的索引并使用简单的loc

        df  = df.set_index(["key1", "key2"])
        df2 = df2.set_index(["key1", "key2"])
        

        然后

        df.loc[:, "new_feature"] = df2['new_feature']
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-11-03
          • 2023-02-10
          • 2018-07-22
          • 1970-01-01
          • 2017-06-11
          • 2016-01-01
          相关资源
          最近更新 更多