2015-05-04 53 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