我的数据框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的答案将解决此问题。
答案 0 :(得分: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
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