在数值最近的索引、完全外连接、聚合列上合并 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
【问题讨论】:
您应该使用df1
和1,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 时间序列数据集到最大值的主要内容,如果未能解决你的问题,请参考以下文章