python - Pandas merge_asof 问题 : one-to-multiple merge

标签 python pandas dataframe merge

我正在尝试按最近的时间点合并两个数据帧。 我尝试了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/

相关文章:

python - 合并多个 DataFrames Pandas

python - 使用 iterrows 对最后一次迭代值执行操作

python - 将 Pandas 日期列转换为经过的秒数

python - 使用pandas将txt文件转换为dataframe

python - 将 CSV 数据逐步写入硬盘以减少内存占用

python - tkinter:如何制作不使用 winico 的系统托盘应用程序?

Python Pandas : Counting keys and summing up their values in a data frame

R 如果满足条件或者是特定行号,则删除行

java - 使用 >>、>、>|、||、|<、<、<< 进行可视化调试

python - 在 Ubuntu 上使用 Scrapy 和 VPN