代码之家  ›  专栏  ›  技术社区  ›  AlexW

PADAS-合并两个数据帧覆盖并指定要保留的列

  •  3
  • AlexW  · 技术社区  · 6 年前

    我试图合并到熊猫数据帧,虽然我想要的可能不是合并。

    我在两个框架中有两列匹配,一列共享可用于联接的唯一值。另一列有一个空字段和一个填充字段。

    我想在匹配唯一字段的同时覆盖EMTPY字段,但只保留被覆盖的列,我不希望第二个数据帧中的其余列。

    希望下面能进一步解释

    >>> animals = [{"animal" : "dog", "name" : "freddy", "food" : ""},{"animal" : "cat", "name" : "dexter", "food" : ""},{"animal" : "dog", "name" : "lou lou", "food" : ""}]
    >>> foods = [{"name" : "freddy", "food" : "dog mix", "brand" : "doggys dog"},{"name" : "dexter", "food" : "fussy cat mix", "brand" : "fish fishy"},{"name" : "lou lou", "food" : "bones", "brand" : "i was a cow"}]
    >>> a_pd = pd.DataFrame(animals)
    >>> a_pd
      animal food     name
    0    dog        freddy
    1    cat        dexter
    2    dog       lou lou
    >>> f_pd = pd.DataFrame(foods)
    >>> f_pd
             brand           food     name
    0   doggys dog        dog mix   freddy
    1   fish fishy  fussy cat mix   dexter
    2  i was a cow          bones  lou lou
    >>>
    >>>
    >>> animal_data = a_pd.merge(f_pd, on='name', how='left')
    >>> animal_data
      animal food_x     name        brand         food_y
    0    dog          freddy   doggys dog        dog mix
    1    cat          dexter   fish fishy  fussy cat mix
    2    dog         lou lou  i was a cow          bones
    >>>
    

    我应该只吃点东西,我不想要这个品牌(还要注意这是样本数据,实时数据有更多的列

    期望结果

    >>> animal_data
      animal        name            food
    0    dog      freddy         dog mix
    1    cat      dexter   fussy cat mix
    2    dog     lou lou           bones
    
    4 回复  |  直到 6 年前
        1
  •  4
  •   Scott Boston    6 年前

    用途:

    animal_data = a_pd.merge(f_pd, on='name', how='left', suffixes=('_x','')).drop('food_x', axis=1)
    

    输出:

      animal     name        brand           food
    0    dog   freddy   doggys dog        dog mix
    1    cat   dexter   fish fishy  fussy cat mix
    2    dog  lou lou  i was a cow          bones
    

    a_pd[['animal','name']].merge(f_pd, how='left')
    

    输出:

    动物名品牌食品
    0狗Freddy Doggys狗-狗混合
    1只猫,德克斯特鱼,鱼,挑剔的猫混合
    2狗楼一是牛骨
    
        2
  •  2
  •   BENY    6 年前

    你可以使用 update

    a_pd.set_index('name',inplace=True)
    a_pd.update(f_pd.set_index('name'))
    a_pd
    Out[68]: 
            animal           food
    name                         
    freddy     dog        dog mix
    dexter     cat  fussy cat mix
    lou lou    dog          bones
    a_pd.reset_index()
    Out[69]: 
          name animal           food
    0   freddy    dog        dog mix
    1   dexter    cat  fussy cat mix
    2  lou lou    dog          bones
    

    或者我们使用 map

    a_pd.food=a_pd.name.map(f_pd.set_index('name').food)
    a_pd
    Out[74]: 
      animal           food     name
    0    dog        dog mix   freddy
    1    cat  fussy cat mix   dexter
    2    dog          bones  lou lou
    
        3
  •  2
  •   Piotrek    6 年前

    我要么尝试 drop 或者只选择要保留的列:

    animal_data.drop(['food_x', 'brand'], axis=1, inplace=True)
    

    animal_data = animal_data[['animal', 'name', 'food']]
    
        4
  •  2
  •   PaSTE Zac Gochenour    6 年前

    最好合并不包含合并数据帧中不需要的列的数据帧的视图。例如:

    a_cols = ['animal', 'name']
    f_cols = ['food', 'name']
    a_pd[a_cols].merge(f_pd[f_cols], on='name', how='left')
    

    如果使用非常大的数据帧,这可能会更快,并且可能会节省一些内存,因为在合并中只结转了相关的列。