丢弃不在中间的熊猫中的纳米行

时间:2017-12-21 01:42:18

标签: python pandas

我有一个按时间索引的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

在这个例子中,我想删除前两行和后两行。但不是中间有纳米的行。有没有办法做到这一点?

3 个答案:

答案 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)

使用bfillffill

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
相关问题