Pandas:更新第二个数据帧的列值

时间:2018-04-06 04:57:09

标签: python pandas dataframe left-join

我的数据框df1包含日期和其他值,如下所示:

date      value1     value2     value3
20100101  1          2          3
20100102  1          2          3
20100103  1          2          3
20100104  1          3          4
20100105  1          3          4
20100106  1          3          5
20100107  1          3          6

然后,我想更新其他数据框df2中的某些值:

date      value1      
20100102  2           
20100104  3        
20100105  4    
20100106  5       
20100107  6     

所以预期结果将是:

date      value1     value2     value3
20100101  1          2          3
20100102  2          2          3
20100103  1          2          3
20100104  3          3          4
20100105  4          3          4
20100106  5          3          5
20100107  6          3          6  

据我所知,我无法通过左连接执行此操作,除了遍历每个日期之外,还有其他快速简便的方法吗?

更新

感谢所有答案!

df2df1的日期不同时,我又遇到了另一种情况,例如

date      value1      
20100102  2           
20100104  3        
20100105  4    
20100106  5       
20100107  6   
20100108  7

dropna(axis=0, how='any')添加到piRSquared的答案将解决此问题。

2 个答案:

答案 0 :(得分:1)

选项1

d2.set_index('date').combine_first(
    d1.set_index('date')).reset_index().astype(d1.dtypes)

       date  value1  value2  value3
0  20100101       1       2       3
1  20100102       2       2       3
2  20100103       1       2       3
3  20100104       3       3       4
4  20100105       4       3       4
5  20100106       5       3       5
6  20100107       6       3       6

选项2

d1[['date']].merge(d2, 'left').combine_first(d1).astype(d1.dtypes)

       date  value1  value2  value3
0  20100101       1       2       3
1  20100102       2       2       3
2  20100103       1       2       3
3  20100104       3       3       4
4  20100105       4       3       4
5  20100106       5       3       5
6  20100107       6       3       6

答案 1 :(得分:1)

我认为这更快:

In [58]: df.loc[df[df.date.isin(sd.date)].index,'value1'] = sd.value1.values.tolist()

In [59]: df
Out[59]: 
       date  value1  value2  value3
0  20100101       1       2       3
1  20100102       2       2       3
2  20100103       1       2       3
3  20100104       3       3       4
4  20100105       4       3       4
5  20100106       5       3       5
6  20100107       6       3       6
In [61]: %timeit df.loc[df[df.date.isin(sd.date)].index,'value1'] = sd.value1.values.tolist()
1000 loops, best of 3: 703 µs per loop

In [62]: %timeit sd.set_index('date').combine_first(df.set_index('date')).reset_index().astype(df.dtypes)
100 loops, best of 3: 4.08 ms per loop