用另一个数据框更新日期框架,该数据框具有不同的列数

时间:2018-12-19 16:07:31

标签: python pandas

我有一个名为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的数据框。在此示例中,数据框为data更新了一些记录的信息,如下所示:

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

我正在尝试找到一种使用update 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

您可以看到data df中Bob的日期更改字段已由Date change df中的updates更新。

如果有人可以指出正确的方向,我将不胜感激

谢谢

2 个答案:

答案 0 :(得分:1)

前一段时间,我也在处理这个问题。直截了当的.update给了我一些问题(对不起,我记不清我遇到的确切问题。我想是因为当您进行.update时,它依赖于索引匹配,而索引却不匹配在我的2个单独的数据框中。因此,我想使用某些列作为索引进行更新),

但是我做了一个函数来处理它。因此,这可能比需要的方法矫kill过正,但请尝试一下,看看是否会起作用。

我还假设您要从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

答案 1 :(得分:0)

使用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)