按时间戳交错Pandas数据帧

时间:2015-05-04 07:47:13

标签: python pandas

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

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

示例:

First Dataframe:

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

第二个DataFrame:

+----+----+
| 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

1 个答案:

答案 0 :(得分: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