我有多个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表达式并且失败了。唯一剩下的就是将所有东西拆解成系列并对它们进行采样。必须有更好的方法
答案 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