Python 落在不在中间的熊猫的南排

Python 落在不在中间的熊猫的南排,python,pandas,Python,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

我有一个按时间索引的数据帧

例如:

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

在本例中,我想删除前两行和最后两行。而不是中间的那排。有什么方法可以做到这一点吗?

假设数据是您的数据帧:

a, b = data.dropna().index[[0, -1]]
df.loc[df.Value.first_valid_index(): df.Value.last_valid_index()]

您也可以考虑选择一个特定的列,例如使用<代码>数据['Value] 而不是<代码>数据< /代码> ./P> 这样就可以得到不包含NaN的起始索引和结束索引。然后,您只需获取该切片(小心包含最后一行):

结果:

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
            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
@unutbu提示使用
loc
后的单行解决方案:

data.loc[slice(*data.dropna().index[[0, -1]])]

您可以使用第一个有效值和最后一个有效值的索引来筛选数据帧:

a, b = data.dropna().index[[0, -1]]
df.loc[df.Value.first_valid_index(): df.Value.last_valid_index()]
结果:

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
            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

使用
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

什么定义了“中间”?是否会删除
2010-01-04
中的
NaN
?您是否正在尝试删除位于开始或结束处的所有连续
NaN
行?是。不应删除2010-01-04上的NAN为了避免
数据[A:b+1]
中的+1,您也可以使用
数据。loc[A,b]
因为
loc
包括两个端点。