我有一个按时间索引的pandas数据框,
例如:
Time Value
2010-01-01 nan
2010-01-02 nan
2010-01-03 3
2010-01-04 4
2010-01-05 5
2010-01-06 3
2010-01-07 nan
2010-01-08 nan
2010-01-09 3
2010-01-10 3
2010-01-11 4
2010-01-12 5
2010-01-13 3
2010-01-14 nan
2010-01-15 nan
在这个例子中,我想删除前两行和后两行。但不是中间有纳米的行。有没有办法做到这一点?
答案 0 :(得分:4)
您可以使用第一个有效值的索引和上一个有效值来过滤数据帧:
df.loc[df.Value.first_valid_index(): df.Value.last_valid_index()]
结果:
Value
Time
2010-01-03 3.0
2010-01-04 4.0
2010-01-05 5.0
2010-01-06 3.0
2010-01-07 NaN
2010-01-08 NaN
2010-01-09 3.0
2010-01-10 3.0
2010-01-11 4.0
2010-01-12 5.0
2010-01-13 3.0
答案 1 :(得分:1)
假设data
是您的数据框:
a, b = data.dropna().index[[0, -1]]
您还可以考虑选择特定的列,例如使用data['Value']
代替data
。
通过这种方式,您可以获得不包含NaN的起始和结束索引 。然后你必须得到那个切片(小心包括最后一行):
data[a:b+1]
结果:
Time Value
2010-01-03 3
2010-01-04 4
2010-01-05 5
2010-01-06 3
2010-01-07 nan
2010-01-08 nan
2010-01-09 3
2010-01-10 3
2010-01-11 4
2010-01-12 5
2010-01-13 3
@ unutbu提示使用loc
后的单行解决方案:
data.loc[slice(*data.dropna().index[[0, -1]])]
答案 2 :(得分:0)
使用bfill
和ffill
df[df.Value.ffill().notnull()&df.Value.bfill().notnull()]
Out[464]:
Time Value
2 2010-01-03 3.0
3 2010-01-04 4.0
4 2010-01-05 5.0
5 2010-01-06 3.0
6 2010-01-07 NaN
7 2010-01-08 NaN
8 2010-01-09 3.0
9 2010-01-10 3.0
10 2010-01-11 4.0
11 2010-01-12 5.0
12 2010-01-13 3.0