左连接然后填充空值并不能充分利用right
中的数据。通常我们期望从最近的right
数据中进行前向填充。
注意到尽管df2
中有2、4和6的数据,可以很好地近似3、5和7的值,但下方仍然存在大量NaN值。
In [47]: df1 = pd.DataFrame({'a': [1, 3, 5, 7]}, index=[1, 3, 5, 7])
...: df2 = pd.DataFrame({'b': [2, 4, 6, 8]}, index=[2, 4, 6, 8])
In [48]: pd.merge(df1, df2, how='left', left_index=True, right_index=True).ffill()
Out[48]:
a b
1 1 NaN
3 3 NaN
5 5 NaN
7 7 NaN
不要这样,先填充再合并。确保我们从df2的最新日期获取数据。
In [50]: new_df2 = df2.reindex(df1.index, method='ffill')
In [51]: new_df2
Out[51]:
b
1 NaN
3 2.0
5 4.0
7 6.0
然后加入:
In [52]: pd.merge(df1, new_df2, how='left', left_index=True, right_index=True)
Out[52]:
a b
1 1 NaN
3 3 2.0
5 5 4.0
7 7 6.0
how='outer'
。 - chrisbfillna
是否必要?这不是左连接的默认行为吗? - tumultous_roosterdf = pd.merge(df1, df2, on='DateTime', how='left').ffill()
- bg9848