pandas更新选择列并跟踪更改日期

时间:2017-10-31 18:14:15

标签: python pandas

我有两个数据框,需要更新第一个中的某些列,并在第二个中使用相应的值,然后更改日期列以反映存在更改。

today = datetime.datetime.today().date()

df1 = pd.DataFrame([['alpha','foo','buzz','fox',datetime.date(2017,5,31),np.nan],['Beta','foo','flop','cat',datetime.date(2017,8,11),datetime.date(2017,9,19)],
                   ['Gamma','bar','honk','sheep',datetime.date(2017,8,12),np.nan],['omega','bar','growl','dog',datetime.date(2017,2,23),datetime.date(2017,3,2)]], 
                   columns = ['type','col1','col2','enteredCol','CreationDate','lastUpdateDate']).set_index(['type'])

print df1

      col1   col2 enteredCol CreationDate lastUpdateDate
type                                                    
alpha  foo   buzz        fox   2017-05-31            NaN
Beta   foo   flop        cat   2017-08-11     2017-09-19
Gamma  bar   honk      sheep   2017-08-12            NaN
omega  bar  growl        dog   2017-02-23     2017-03-02


df2 = pd.DataFrame([['alpha','bar','buzz'],['Beta','foo','twist'],['Gamma','bar','honk']], columns = ['type','col1','col2']).set_index(['type'])

print df2
      col1   col2
type             
alpha  bar   buzz
Beta   foo  twist
Gamma  bar   honk

如果col1或col2在df2中不同,我需要更新df1中的相应值。如果进行了更改,则需要将lastUpdateDate设置为今天的日期

#run update on col1 and col2 - if updated, change lastUpdateDate to today's date

print df_out

      col1   col2 enteredCol CreationDate lastUpdateDate
type                                                    
alpha  bar   buzz        fox   2017-05-31     2017-10-31
Beta   foo  twist        cat   2017-08-11     2017-10-31
Gamma  bar   honk      sheep   2017-08-12            NaN
omega  bar  growl        dog   2017-02-23     2017-03-0

关于如何做到这一点的想法?我可以手动合并每个更改的列并进行比较,但我需要检查许多列。 df.update()没有注意到值已被更改,或者我也可以使用它。

2 个答案:

答案 0 :(得分:2)

使用combine_first然后使用布尔索引:

df_out = df2.combine_first(df1)

df_out.loc[~df1[['col1','col2']].eq(df_out[['col1','col2']]).all(1),'lastUpdateDate'] = today

print(df_out)

输出:

      CreationDate col1   col2 enteredCol lastUpdateDate
type                                                    
Beta    2017-08-11  foo  twist        cat     2017-10-31
Gamma   2017-08-12  bar   honk      sheep            NaN
alpha   2017-05-31  bar   buzz        fox     2017-10-31
omega   2017-02-23  bar  growl        dog     2017-03-02

答案 1 :(得分:-1)

我正在努力解决你的问题。 但如果我正确阅读,只需使用面具。

{{1}}

其中todays_date是字符串格式化日期