我正在尝试按最近的时间点合并两个数据帧。
我尝试了merge_asof
。然而,问题是两个条目具有相同的时间点,那么
merge_asof
只会将一个条目合并到最终的数据帧中。
这是一个例子:
df_A:
time ticker price
09:10:13 VOD 110.96
df_B:
time ticker volume
09:10:12 VOD 35412
09:10:12 VOD 12343
我尝试过:
pd.merge(df_A, df_B, how = 'left', on = ['time'], by=['ticker'], direction='backward')
它只返回:
time ticker price volume
09:10:13 VOD 110.96 12343
如您所见,此处删除了一个条目/行。 我想使用 merge_asof 并将所有条目保留在同一最近的时间点下。
理想输出:
time ticker price volume
09:10:12 VOD 110.96 35412
09:10:12 VOD 110.96 12343
有什么建议吗?
最佳答案
您需要执行两次合并
,首先使用merge_asof
,然后执行经典合并
。诀窍是识别 asof 合并的右侧 DataFrame 中的重复项:
df_B2 = df_B.assign(idx=df_B.groupby('time').ngroup())
out = (pd
.merge_asof(df_A, df_B2, on='time', by='ticker', direction='backward')
.merge(df_B2, on=['ticker', 'idx'])
#.drop(columns='idx')
)
注意。我在示例中使用了datetime
列
输出:
time_x ticker price volume_x idx time_y volume_y
0 2022-06-27 09:10:13 VOD 110.96 12343 0 2022-06-27 09:10:12 35412
1 2022-06-27 09:10:13 VOD 110.96 12343 0 2022-06-27 09:10:12 12343
使用的输入:
df_A = pd.DataFrame({'time': [Timestamp('2022-06-27 09:10:13')],
'ticker': ['VOD'], 'price': [110.96]})
df_B = pd.DataFrame({'time': [Timestamp('2022-06-27 09:10:12'), Timestamp('2022-06-27 09:10:12')],
'ticker': ['VOD', 'VOD'],
'volume': [35412, 12343]})
关于python - Pandas merge_asof 问题 : one-to-multiple merge,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72778033/