Pandas特殊连接 —— merge_ordered及merge_asof

文章介绍了Pandas库中的两个特殊连接函数merge_ordered和merge_asof的使用方法。merge_ordered适用于有序变量的外连接,通过分组和插值处理缺失值;merge_asof则用于基于时间序列的模糊连接,允许指定方向和容忍度来匹配数据。
摘要由CSDN通过智能技术生成

目录

特殊连接

merge_ordered()

merge_asof()


特殊连接

  • merge_ordered()和merge_asof()是pandas的特殊连接。用于有序变量为键的合并,其参数中on、left_on、right_on、suffix和普通连接merge()的参数一致。
  • 区别:merge_ordered()用于连接、插值和分组打包,而merge_asof()用于模糊连接。

merge_ordered()

构造两个表,按照表一的group进行分组,以time列为键外连接表2,并对结果进行排序,如果组内连接后有缺失值则用前一个元素填充。

import pandas as pd
#表一
df1 = pd.DataFrame({'time':pd.date_range('20230101','20230106'),'left_value':range(6),'group':list('aabbcc')})
df1

输出:

timeleft_valuegroup
02023-01-010a
12023-01-021a
22023-01-022b
32023-01-043b
42023-01-014c
52023-01-035c

df2 = pd.DataFrame({'time':pd.date_range('20230101','20230104'),'right_value':list('ABCD')})
df2 #表二
timeright_value
02023-01-01A
12023-01-02B
22023-01-03C
32023-01-04D

 使用分组策略进行操作:

df3 = df1.groupby('group').apply(
lambda x: x.merge(df2, on='time',how='outer').sort_values('time').ffill())
df3.group = df3.index.get_level_values('group')
df3 = df3.reset_index(drop=True)
df3

输出 :

timeleft_valuegroupright_value
02023-01-010.0aA
12023-01-021.0aB
22023-01-031.0aC
32023-01-041.0aD
42023-01-01NaNbA
52023-01-022.0bB
62023-01-032.0bC
72023-01-043.0bD
82023-01-014.0cA
92023-01-024.0cB
102023-01-035.0cC
112023-01-045.0cD

 使用merge_orgered()进行相同操作。
 

pd.merge_ordered(df1,df2,on='time',how='outer',left_by='group',fill_method='ffill')

输出:

timeleft_valuegroupright_value
02023-01-010.0aA
12023-01-021.0aB
22023-01-031.0aC
32023-01-041.0aD
42023-01-01NaNbA
52023-01-022.0bB
62023-01-032.0bC
72023-01-043.0bD
82023-01-014.0cA
92023-01-024.0cB
102023-01-035.0cC
112023-01-045.0cD

merge_asof()

merge_asof()它是一个左连接函数,功能为键的模糊区配

一个整点时间序列表与一个任意时间戳的时间序列记录表进行连接  

df1 = pd.DataFrame({'time':pd.to_datetime(["20230101 0%d:00:00"%(i+1)for i in range(5)])})
df1

输出:

time
02023-01-01 01:00:00
12023-01-01 02:00:00
22023-01-01 03:00:00
32023-01-01 04:00:00
4

2023-01-01 05:00:00

df2 = pd.DataFrame({'time':pd.to_datetime(['20230101 00:55:00','20230101 01:25:00',
                                          '20230101 02:57:00','20230101 03:00:00','20230101 04:36:00']),'values':[1,2,3,4,5]})
df2

 输出:

timevalues
02023-01-01 00:55:001
12023-01-01 01:25:002
22023-01-01 02:57:003
32023-01-01 03:00:004
42023-01-01 04:36:005
pd.merge_asof(df1,df2,on='time',direction='backward',tolerance=pd.Timedelta('60min'))
timevalues
02023-01-01 01:00:001
12023-01-01 02:00:002
22023-01-01 03:00:004
32023-01-01 04:00:004
42023-01-01 05:00:005

 参数direction为backward,表示表一时间戳的数值 用表二不超过表一该时间戳的最多时间戳对应的值进行填充。例如表一中01:00:00 用表二00:57:00

参数direction还可以选择forward和nearest,分别表示使用不小于填充时间戳的时间戳的对应值填充以及使用时间戳最近的时间戳对应的值填充。参数tolerance表示前后时间戳不超过60分钟 ,可以设置为30,配合nearest使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄昏中起飞的猫头鹰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值