在MultiIndex时间序列中合并后填充空白

时间:2015-05-25 18:19:39

标签: pandas

我有多个MultiIndex时间序列合并在一起,索引是(“location”,“timestamp”)。例如:

location   timestamp     x     y   z
       A           1   1.2   4.3  NaN
       A           2   2.2   5.3  NaN
       A           3   NaN   NaN  1.0
       A           4   3.2   7.3  NaN
...
       B           1   2.2   4.3  NaN
       B           2   3.2   5.3  NaN
       B           3   NaN   NaN  2.0
       B           4   5.2   7.3  NaN
...

“timestamp”是一个真正的日期时间列,为简单起见,我只是在这里使用整数。我正在尝试填充缺失的数据,因此每行都有完整的数字集。 “x”,“y”和“z”与其他数据集平滑无关,因此可以线性地或至少通过重复最后已知的数字垂直地导出缺失值。

我尝试了不同的groupby / resample表达式并且失败了。唯一剩下的就是将所有东西拆解成系列并对它们进行采样。必须有更好的方法

1 个答案:

答案 0 :(得分:1)

以下是几种方法

您可以ffill()转发前一个值。

In [56]: df.ffill()
Out[56]:
  location  timestamp    x    y   z
0        A          1  1.2  4.3 NaN
1        A          2  2.2  5.3 NaN
2        A          3  2.2  5.3   1
3        A          4  3.2  7.3   1
4        B          1  2.2  4.3   1
5        B          2  3.2  5.3   1
6        B          3  3.2  5.3   2
7        B          4  5.2  7.3   2

但是,如果某些内容以NaN开头,则会保留。所以fillna(0)为零。

In [57]: df.ffill().fillna(0)
Out[57]:
  location  timestamp    x    y  z
0        A          1  1.2  4.3  0
1        A          2  2.2  5.3  0
2        A          3  2.2  5.3  1
3        A          4  3.2  7.3  1
4        B          1  2.2  4.3  1
5        B          2  3.2  5.3  1
6        B          3  3.2  5.3  2
7        B          4  5.2  7.3  2

您还可以使用ffill()

来代替pd.Series.interpolate,而不是In [58]: df.apply(pd.Series.interpolate).fillna(0) Out[58]: location timestamp x y z 0 A 1 1.2 4.3 0.00 1 A 2 2.2 5.3 0.00 2 A 3 2.7 6.3 1.00 3 A 4 3.2 7.3 1.25 4 B 1 2.2 4.3 1.50 5 B 2 3.2 5.3 1.75 6 B 3 4.2 6.3 2.00 7 B 4 5.2 7.3 2.00

fillna(0)

而且,您可以使用ffill()

而不是bfill(),而不是In [59]: df.apply(pd.Series.interpolate).bfill() Out[59]: location timestamp x y z 0 A 1 1.2 4.3 1.00 1 A 2 2.2 5.3 1.00 2 A 3 2.7 6.3 1.00 3 A 4 3.2 7.3 1.25 4 B 1 2.2 4.3 1.50 5 B 2 3.2 5.3 1.75 6 B 3 4.2 6.3 2.00 7 B 4 5.2 7.3 2.00
   exp1 exp2 exp3 
    10   20   56