我有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
答案 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