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
包括两个端点。