【问题标题】:Joining Two Different Dataframes on Timestamp在时间戳上加入两个不同的数据帧
【发布时间】:2019-09-08 19:58:56
【问题描述】:

假设我有两个数据框:

df1:                          df2:
+-------------------+----+    +-------------------+-----+
|  Timestamp        |data|    |  Timestamp        |stuff|
+-------------------+----+    +-------------------+-----+
|2019/04/02 11:00:01| 111|    |2019/04/02 11:00:14|  101|
|2019/04/02 11:00:15| 222|    |2019/04/02 11:00:15|  202|
|2019/04/02 11:00:29| 333|    |2019/04/02 11:00:16|  303|
|2019/04/02 11:00:30| 444|    |2019/04/02 11:00:30|  404|
+-------------------+----+    |2019/04/02 11:00:31|  505|
                              +-------------------+-----+

没有遍历 df2 的每一行,我试图根据时间戳连接两个数据帧。因此,对于 df2 中的每一行,它都会从 df1 中“添加”当时特定时间的数据。在此示例中,生成的数据框将是:

Adding df1 data to df2:
+-------------------+-----+----+
|  Timestamp        |stuff|data|
+-------------------+-----+----+
|2019/04/02 11:00:14|  101| 111|
|2019/04/02 11:00:15|  202| 222|
|2019/04/02 11:00:16|  303| 222|
|2019/04/02 11:00:30|  404| 444|
|2019/04/02 11:00:31|  505|None|
+-------------------+-----+----+

遍历 df2 的每一行然后与每个 df1 进行比较是非常低效的。还有其他方法吗?

【问题讨论】:

  • 在我看来,输出不是 基于时间戳,而是基于索引。

标签: python pandas dataframe


【解决方案1】:

使用merge_asof:

df1['Timestamp'] = pd.to_datetime(df1['Timestamp'])
df2['Timestamp'] = pd.to_datetime(df2['Timestamp'])

df = pd.merge_asof(df2, df1, on='Timestamp')
print (df)
            Timestamp  stuff  data
0 2019-04-02 11:00:14    101   111
1 2019-04-02 11:00:15    202   222
2 2019-04-02 11:00:16    303   222
3 2019-04-02 11:00:30    404   444

也可以更改订单df1df2 并添加参数direction='forward'

df = pd.merge_asof(df1, df2, on='Timestamp', direction='forward')
print (df)
            Timestamp  data  stuff
0 2019-04-02 11:00:01   111  101.0
1 2019-04-02 11:00:15   222  202.0
2 2019-04-02 11:00:29   333  404.0
3 2019-04-02 11:00:30   444  404.0
4 2019-04-02 11:00:31   505    NaN

#default direction='backward'
df = pd.merge_asof(df1, df2, on='Timestamp')
print (df)
            Timestamp  data  stuff
0 2019-04-02 11:00:01   111    NaN
1 2019-04-02 11:00:15   222  202.0
2 2019-04-02 11:00:29   333  303.0
3 2019-04-02 11:00:30   444  404.0
4 2019-04-02 11:00:31   505  404.0

【讨论】:

    【解决方案2】:
    将熊猫导入为 pd pd.merge(df1, df2, left_on=['Timestamp'], right_on=['Timestamp'])

    【讨论】:

    • 您好,请解释一下为什么这是一个解决方案。谢谢
    猜你喜欢
    • 2018-11-17
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 2019-11-19
    • 2021-09-05
    • 2015-10-27
    • 2023-01-21
    • 2020-09-23
    相关资源
    最近更新 更多