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

用另一个数据帧更新日期帧,该数据帧的列数不同

  •  0
  • Stacey  · 技术社区  · 6 年前

    我有一个大的 df 打电话 data 看起来像:

         Identifier     Surname  First names(s)  Date change  Work Pattern  Region 
    0       12233.0       Smith             Bob                        FT      NW
    1       54213.0       Jones           Sally     15/04/15           FT      NW
    2       12237.0       Evans           Steve     26/08/14           FT      SE
    3       10610.0      Cooper             Amy     16/08/12           FT      SE
    

    我有另一个数据帧叫做 updates . 在此示例中,数据帧更新了 数据 对于一些记录,如下所示:

         Identifier     Surname  First names(s)   Date change 
    0       12233.0       Smith             Bob      05/09/14                  
    1       10610.0      Cooper             Amy      16/08/12            
    

    我正在尝试用更新df来更新数据,这样得到的数据框看起来像:

         Identifier     Surname  First names(s)  Date change  Work Pattern  Region 
    0       12233.0       Smith             Bob     15/09/14           FT      NW
    1       54213.0       Jones           Sally     15/04/15           FT      NW
    2       12237.0       Evans           Steve     26/08/14           FT      SE
    3       10610.0      Cooper             Amy     16/08/12           FT      SE
    

    如您所见,Bob的日期更改字段位于 数据 df已更新为 Date change 更新 DF。

    如果有人能给我指明正确的方向,我会感激的

    谢谢

    2 回复  |  直到 6 年前
        1
  •  1
  •   chitown88    6 年前

    不久前,我也在处理这个问题。直线上升 .update 给了我一些问题(对不起,我记不起我的确切问题了。我想当你这样做的时候 更新 ,它依赖于索引匹配,它们在我的两个独立数据帧中不匹配。所以我想使用某些列作为我的索引进行更新,

    但是我做了一个功能来处理它。所以这可能比需要的要严重得多,但是试试看它是否有效。

    我还假设您希望从 updates 数据帧应为 15/09/14 05/09/14 . 所以我在下面的样本数据中有不同之处

    另外,我假设 Identifier 是唯一键。如果不是,则需要将多个列作为唯一键。

    import sys
    import pandas as pd
    
    
    data = pd.DataFrame([[12233.0,'Smith','Bob','','FT','NW'],
                        [54213.0,'Jones','Sally','15/04/15','FT','NW'],
                        [12237.0,'Evans','Steve','26/08/14','FT','SE'],
                        [10610.0,'Cooper','Amy','16/08/12','FT','SE']], 
                        columns = ['Identifier','Surname','First names(s)','Date change','Work Pattern','Region'])
    
    
    
    updates = pd.DataFrame([[12233.0,'Smith','Bob','15/09/14'],
                        [10610.0,'Cooper','Amy','16/08/12']],
                        columns = ['Identifier','Surname','First names(s)','Date change'])
    
    
    
    
    def update(df1, df2, keys_list):
        df1 = df1.set_index(keys_list)
        df2 = df2.set_index(keys_list)
    
        dup_idx1 = df1.index.get_duplicates()
        dup_idx2 = df2.index.get_duplicates()
    
        if len(dup_idx1) > 0 or len(dup_idx2) > 0:
            print('\n'+'#'*50+'\nError! Duplicate Indicies:')
            for element in dup_idx1:
                print('df1: %s' %(element,))
            for element in dup_idx2:
                print('df2: %s' %(element,))
            print('#'*50+'\n\n')
    
        df1.update(df2, overwrite=True)
        df1.reset_index(inplace=True)
        df2.reset_index(inplace=True)
        return df1
    
    
    # the 3rd input is a list, in case you need multiple columns as your unique key
    df = update(data, updates, ['Identifier'])
    

    输出:

    print (data)
       Identifier Surname First names(s) Date change Work Pattern Region
    0     12233.0   Smith            Bob                       FT     NW
    1     54213.0   Jones          Sally    15/04/15           FT     NW
    2     12237.0   Evans          Steve    26/08/14           FT     SE
    3     10610.0  Cooper            Amy    16/08/12           FT     SE
    
    
    print (updates)
       Identifier Surname First names(s) Date change
    0     12233.0   Smith            Bob    15/09/14
    1     10610.0  Cooper            Amy    16/08/12
    

    df = update(data, updates, ['Identifier'])

    In [19]: print (df)
       Identifier Surname First names(s) Date change Work Pattern Region
    0     12233.0   Smith            Bob    15/09/14           FT     NW
    1     54213.0   Jones          Sally    15/04/15           FT     NW
    2     12237.0   Evans          Steve    26/08/14           FT     SE
    3     10610.0  Cooper            Amy    16/08/12           FT     SE
    
        2
  •  0
  •   user3471881    6 年前

    使用 DataFrame.update .

    第一组索引:

    data.set_index('Identifier', inplace=True)
    updates.set_index('Identifier', inplace=True)
    

    然后更新:

    data.update(updates)
    
    print(data)
               Surname First names(s) Date change Work Pattern Region
    Identifier                                                       
    12233.0      Smith            Bob    15/09/14           FT     NW
    54213.0      Jones          Sally    15/04/15           FT     NW
    12237.0      Evans          Steve    26/08/14           FT     SE
    10610.0     Cooper            Amy    16/08/12           FT     SE
    

    如果需要多个列来创建唯一的 index 你可以用列表来设置它们。例如:

    data.set_index(['Identifier', 'Surname'], inplace=True)
    updates.set_index(['Identifier', 'Surname'], inplace=True)
    
    data.update(updates)