2015-05-04 55 views
0

我有2熊猫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,但留给我很多NaNs nd一个未分类的表格。

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

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

您可以改为将数据框重新索引到通用索引。在你的情况,因为最大的索引是5的目标数据框,让使用此列表,以重新编制两个输入dataframes:

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

谢谢 而不是fillna,我用重新索引方法 的方法参数 reindex(ind,method ='ffill') – Simbi