【问题标题】:Interleaving Pandas Dataframes by Timestamp按时间戳交错 Pandas 数据帧
【发布时间】:2015-05-04 17:14:44
【问题描述】:

我有 2 个 Pandas DataFrame,每个包含 2 列。其中一列是时间戳列 [t],另一列包含传感器读数 [s]。

我现在想创建一个包含 4 列的单个 DataFrame,它在时间戳列上交错。

例子:

第一个数据框:

+----+----+
| t1 | s1 |
+----+----+
|  0 |  1 |
|  2 |  3 |
|  3 |  3 |
|  5 |  2 |
+----+----+

第二个数据框:

+----+----+
| t2 | s2 |
+----+----+
|  1 |  5 |
|  2 |  3 |
|  4 |  3 |
+----+----+

目标:

+----+----+----+----+
| t1 | t2 | s1 | s2 |
+----+----+----+----+
|  0 |  0 |  1 |  0 |
|  0 |  1 |  1 |  5 |
|  2 |  1 |  3 |  5 |
|  2 |  2 |  3 |  3 |
|  3 |  2 |  3 |  3 |
|  3 |  4 |  3 |  3 |
|  5 |  4 |  2 |  3 |
+----+----+----+----+

我看了一下 pandas.merge,但这给我留下了很多 NaN 和一个未排序的表。

a.merge(b, how='outer')
Out[55]: 
   t1  s1  t2  s2
0   0   1 NaN NaN
1   2   3   2   3
2   3   3 NaN NaN
3   5   2 NaN NaN
4   1 NaN   1   5
5   4 NaN   4   3

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    如果两个索引中都不存在这些值,则合并会将 NaN 放在您合并的公共列中。它不会创建正在合并的数据框中不存在的新数据。 例如,目标数据框中的索引 0 显示 t2 的值为 0。这在第二个数据框中不存在,因此您也不能期望它出现在合并的数据框中。同样适用于其他行。

    您可以做的是将数据帧重新索引到一个公共索引。在您的情况下,由于目标数据帧中的最大索引为 5,让我们使用此列表重新索引两个输入数据帧:

    In [382]: ind
    Out[382]: [0, 1, 2, 3, 4, 5]
    

    现在,我们将根据该索引的两个输入重新索引:

    In [372]: x = a.set_index('t1').reindex(ind).fillna(0).reset_index()
    
    In [373]: x
    Out[373]: 
       t1   s1
    0   0    1
    1   1    0
    2   2    3
    3   3    3
    4   4    0
    5   5    2
    
    In [374]: y = b.set_index('t2').reindex(ind).fillna(0).reset_index()
    
    In [375]: y
    Out[375]: 
       t2   s2
    0   0    0
    1   1    5
    2   2    3
    3   3    0
    4   4    5
    5   5    0
    

    而且,现在我们合并它以获得接近目标数据框的东西:

    In [376]: x.merge(y, left_on=['t1'], right_on=['t2'], how='outer')
    Out[376]: 
       t1   s1  t2   s2
    0   0    1   0    0
    1   1    0   1    5
    2   2    3   2    3
    3   3    3   3    0
    4   4    0   4    5
    5   5    2   5    0
    

    【讨论】:

    • 谢谢,我用reindex方法reindex(ind, method='ffill')的method参数代替了fillna
    猜你喜欢
    • 2015-05-08
    • 2022-11-30
    • 2022-07-11
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 2013-01-14
    • 2021-06-22
    • 2021-05-07
    相关资源
    最近更新 更多