Pandas:从第二个数据框更新列值

3

我有一个数据框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  

据我所知,使用左连接无法实现此操作,除了逐个迭代日期,还有什么快速简便的方法可以实现吗?
更新:
感谢所有答案!
当df2与df1具有不同的日期时,例如:
date      value1      
20100102  2           
20100104  3        
20100105  4    
20100106  5       
20100107  6   
20100108  7

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

5

选项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

Option 2
选项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
谢谢!这正是我想要的。另外,我已经添加了dropna(axis=0, how='any')来删除在d1中找不到日期的d2中的行。 - undefined

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

谢谢!这个解决方案对于这个特定的问题非常有效! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接