gpt4 book ai didi

python - 在不完全匹配的时间戳上合并两个 Pandas 数据帧

转载 作者:太空宇宙 更新时间:2023-11-04 03:28:39 26 4
gpt4 key购买 nike

我尝试在网站上搜索实现此目的的好方法(也尝试了一些关于分箱和时间序列的想法)但仍然找不到合适的解决方案。

问题来了

我有两个数据框:

    index   name    time            price
1, AAA, 11:37:09.359479, 58.480000,10
2, ABC, 11:37:15.403268, 0.5000000,3
3, ABB, 11:37:15.491515, 0.4500000,2
4, AAA, 11:37:15.604864, 0.5000000,1
5, ABC, 11:37:16.628756, 0.1800000,20
6, ABD, 11:37:21.083105, 0.8000000,7
7, AAA, 11:37:21.423480, 79.030000,10


index name time price

1, ABB, 11:37:15.491525, 0.4500000,2
2, AAA, 11:37:15.604884, 0.5000000,1
3, ABC, 11:37:16.628796, 0.1800000,20

正如您所看到的,数据帧 1 中的索引 3、4、5 与数据帧 2 中的索引 1、2、3 相对应

我需要将这些数据帧合并到“时间”列中的一个,这样对于数据帧 1 中的记录 3、4、5,数据帧 2 中的索引 1、2、3 位于右侧。

应该是这样的结果:

index_x name_x  time_x          price_x         name_y  time_y          price_y
1, AAA, 11:37:09.359479, 58.480000,10 Nan ...
2, ABC, 11:37:15.403268, 0.5000000,3 Nan ..
3, ABB, 11:37:15.491515, 0.4500000,2 ABB, 11:37:15.491525, 0.4500000,2
4, AAA, 11:37:15.604864, 0.5000000,1 AAA, 11:37:15.604884, 0.5000000,1
5, ABC, 11:37:16.628756, 0.1800000,20 ABC, 11:37:16.628796, 0.1800000,20
6, ABD, 11:37:21.083105, 0.8000000,7 Nan ..
7, AAA, 11:37:21.423480, 79.030000,10 Nan ..

我遇到了麻烦,因为时间不完全相同(查看最后 2 微秒)。有没有一种很好的合并方式,即按时合并这些时间不完全匹配,但可能给出一些匹配阈值?此外,每条记录的匹配项不应超过一个。

如果清楚了请告诉我。

非常感谢您!

最佳答案

不幸的是,这些“势均力敌”在 pandas 中很少有 super 简单的解决方案,但这还算不错。您可以做的是从@CharlieHaley 的解决方案开始,然后将其放入一个循环中,这样您就可以进行最精确的匹配并丢弃不太精确的匹配。

当然,这仍然让您决定使用哪种精度级别(如“decimal_range”中指定的那样)。我从 7 开始范围以保持输出简洁,但您希望从 1 开始,然后决定要运行它的高度,因为数字越大匹配越不精确。

(注意:我假设您的初始数据帧是“df1”和“df2”,并且“时间”是一个字符串,如果不是,您需要先将其转换为字符串。)

decimal_range = range(7,9)

df1 = df1.reset_index() # this creates column 'index' later used for
# dropping duplicates. depending on your
# goals, may want to do for df2 instead of df1
df3=pd.DataFrame()

for i in decimal_range:
df1['time2'] = df1['time'].str[:-i]
df2['time2'] = df2['time'].str[:-i]
df3 = df3.append( df1.merge(df2,on=['name','time2'], how='inner'), )

df4 = df3.drop_duplicates(subset=['index','name'])

显示中间输出可能会使这一点更清楚。在 i=7 合并时,有 3 个匹配项,但在 i=8 处有 4 个匹配项。 “time2”列显示用于匹配的精度。

df3

index name time_x price_x time2 time_y price_y
0 2 ABB 11:37:15.491515 0.45 11:37:15 11:37:15.491525 0.45
1 3 AAA 11:37:15.604864 0.50 11:37:15 11:37:15.604884 0.50
2 4 ABC 11:37:16.628756 0.18 11:37:16 11:37:16.628796 0.18
0 1 ABC 11:37:15.403268 0.50 11:37:1 11:37:16.628796 0.18
1 4 ABC 11:37:16.628756 0.18 11:37:1 11:37:16.628796 0.18
2 2 ABB 11:37:15.491515 0.45 11:37:1 11:37:15.491525 0.45
3 3 AAA 11:37:15.604864 0.50 11:37:1 11:37:15.604884 0.50

累积匹配后,只需删除重复项以保持更精确的匹配。

df4

index name time_x price_x time2 time_y price_y
0 2 ABB 11:37:15.491515 0.45 11:37:15 11:37:15.491525 0.45
1 3 AAA 11:37:15.604864 0.50 11:37:15 11:37:15.604884 0.50
2 4 ABC 11:37:16.628756 0.18 11:37:16 11:37:16.628796 0.18
0 1 ABC 11:37:15.403268 0.50 11:37:1 11:37:16.628796 0.18

关于python - 在不完全匹配的时间戳上合并两个 Pandas 数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32014966/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com