在数值最近的索引、完全外连接、聚合列上合并 Pandas 时间序列数据集到最大值

Posted

技术标签:

【中文标题】在数值最近的索引、完全外连接、聚合列上合并 Pandas 时间序列数据集到最大值【英文标题】:Merge Pandas Time Series Datasets on numerically nearest index, full outer join, aggregate column to max 【发布时间】:2020-02-12 13:10:47 【问题描述】:

我有两个时间序列,它们有重叠的事件,但它们也有另一个不包含的不同事件。重叠事件的时间戳很接近,但不能保证相等。

我想合并这两个数据集,以在事件重叠时取两个 max_val 列中的最大值,并将合并集中的不同事件与它们最初设置的 max_val 保持一致。

我玩过各种 merge_asof、groupby 组合,但我是 python 新手,努力获得任何按预期工作的东西,或多或少是可读和直观的。

注意:示例数据使用整数作为时间戳,以便于设置,但实际数据是真实的时间戳,应该等效于 merge_asof(direction="nearest", tolerance="10ms")。 不过,我看不到如何将merge_asof 作为完整的外部联接。据我所知,似乎只提供左连接。

import pandas
df1 = pandas.DataFrame([[1.002,18],[2,22],[3,77],[5,23]], columns=["timestamp", "max_val"])
df2 = pandas.DataFrame([[1,33],[2,12],[3.001,87],[4,54]], columns=["timestamp", "max_val"])

merged_df = pandas.merge_asof(df1,df2, on="timestamp")

print(df1)
print(df2)
print(merged_df)

输出:

   timestamp  max_val
0      1.002       18
1      2.000       22
2      3.000       77
3      5.000       23
   timestamp  max_val
0      1.000       33
1      2.000       12
2      3.001       87
3      4.000       54
   timestamp  max_val_x  max_val_y
0      1.002         18         33
1      2.000         22         12
2      3.000         77         12
3      5.000         23         54

期望的结果:(不关心合并时哪个时间戳仍然存在)

   timestamp  max_val
0      1.002         33
1      2.000         22
2      3.000         87
3      4.000         54
4      5.000         23

【问题讨论】:

您应该使用df11,2.01,3.1, 5 时间戳来更新您的数据。 是的,感谢您对答案的初步了解,@QuangHoang。我没有意识到它会像将整数设置为浮点数以复制我更复杂的时间戳一样简单。我会这样做的。 我从模糊的 “在最近的索引上合并 ...” “在数字上最近的索引上合并 ...” 编辑了您的标题。。跨度> 【参考方案1】:

我会做一个merge_asof,然后是一个外部merge

# dummy variable for later join
df2['Rank'] = df2['timestamp'].rank()

new_df = (pd.merge_asof(df1, df2, 
              on='timestamp',
              direction='nearest', 
              tolerance=0.01)
   .merge(df2, on='Rank', how='outer')
   .assign(timestamp = lambda x: x.filter(like='timestamp').bfill(1).iloc[:,0])
   .assign(max_val=lambda x: x.filter(like='max_val').max(1))
   .sort_values('timestamp')
   [['timestamp','max_val']]
)

输出:

   timestamp  max_val
0      1.002     33.0
1      2.000     22.0
2      3.000     87.0
4      4.000     54.0
3      5.000     23.0

【讨论】:

感谢您的回答。我要到明天才能回到我的机器上进行测试,但期待届时检查一下。 在我的简单示例 ideone.com/CYPIk4 以及我的实时数据集中运行此命令时,我得到一个 KeyError: 'Rank'。 非常感谢您的帮助。你对 python 的掌握是一种令人印象深刻的力量展示。我只是在涉猎,发现它与打字语言有一种奇怪的区别。

以上是关于在数值最近的索引、完全外连接、聚合列上合并 Pandas 时间序列数据集到最大值的主要内容,如果未能解决你的问题,请参考以下文章

数据规整:聚合合并和重塑

使用完全外连接合并两个数据帧在两个数据帧上没有获得关键列

R data.table 合并/完全外连接与 na.fill / nomatch 基于公式

sql 优化

如何在日期时间索引和两列上合并熊猫数据框

列上加索引时事有条件