Python 移除大熊猫的头带

Python 移除大熊猫的头带,python,numpy,pandas,Python,Numpy,Pandas,我怎样才能去掉熊猫身上的头像呢 pd.Series([np.nan, np.nan, np.nan, 1, 2, np.nan, 3]) 我只想删除上面的前3个NaN,因此结果应该是: pd.Series([1, 2, np.nan, 3]) 要删除前导的np.nan: 查找第一个非nan索引 查找第一个非nan项的索引 s = pd.Series([np.nan, np.nan, np.nan, 1, 2, np.nan, 3]) nans = s.apply(np.isnan) f

我怎样才能去掉熊猫身上的头像呢

pd.Series([np.nan, np.nan, np.nan, 1, 2, np.nan, 3])
我只想删除上面的前3个NaN,因此结果应该是:

pd.Series([1, 2, np.nan, 3])

要删除前导的
np.nan


查找第一个非nan索引

查找第一个非nan项的索引

s = pd.Series([np.nan, np.nan, np.nan, 1, 2, np.nan, 3])

nans = s.apply(np.isnan)

first_non_nan = nans[nans == False].index[0] # get the first one
输出

s[first_non_nan:]
Out[44]:
3     1
4     2
5   NaN
6     3
dtype: float64

以下是仅使用pandas方法的另一种方法:

In [103]:
s = pd.Series([np.nan, np.nan, np.nan, 1, 2, np.nan, 3])
first_valid = s[s.notnull()].index[0]
s.iloc[first_valid:]

Out[103]:
3     1
4     2
5   NaN
6     3
dtype: float64
因此,我们使用
notnull
过滤序列以获得第一个有效索引。然后使用iloc对序列进行切片

编辑

正如@ajcr所指出的,最好使用内置方法,因为它不会返回我在上述答案中用来屏蔽的临时序列,另外,使用
loc
使用索引标签,而不是
iloc
,后者使用序号位置,适用于索引不是Int64索引的一般情况:

In [104]:
s = pd.Series([np.nan, np.nan, np.nan, 1, 2, np.nan, 3])
s.loc[s.first_valid_index():]

Out[104]:
3     1
4     2
5   NaN
6     3
dtype: float64

这里可以建议另外两种方法,假设
A
作为输入序列

方法#1:采用切片-

A[np.where(~np.isnan(A))[0][0]:] 
方法2:使用掩蔽-

A[np.maximum.accumulate(~np.isnan(A))]
样本运行-

In [219]: A = pd.Series([np.nan, np.nan, np.nan, 1, 2, np.nan, 3])

In [220]: A
Out[220]: 
0   NaN
1   NaN
2   NaN
3     1
4     2
5   NaN
6     3
dtype: float64

In [221]: A[np.where(~np.isnan(A))[0][0]:]       # Approach 1
Out[221]: 
3     1
4     2
5   NaN
6     3
dtype: float64

In [222]: A[np.maximum.accumulate(~np.isnan(A))]  # Approach 2
Out[222]: 
3     1
4     2
5   NaN
6     3
dtype: float64

pd.Series([np.nan,np.nan,np.nan,1,2,np.nan,3][3:])
像这样?@clemtoy就是一个例子。我不知道我有多少领先的NaN我希望有一个向量化的解决方案我认为列表理解仍然会在Python解释器中循环,而不是在数值解释器中使用向量化操作libs@clemtoy正如bakkal所说,[tab…]中的n代表n]没有矢量化。另外,您必须使用
np.isnan(n)
来测试NaN,
n!=np.nan
不起作用(在控制台中尝试
np.nan==np.nan
)@bakkal啊好的,我错误地解释了“矢量化”对不起。它起作用的情况除外,序列只有nan值。首先有效的索引将引发索引错误。为了防止这种情况发生,我以前必须测试所有的nan案例。如果不是ny.isnan(df.values).all()@JulienV为真,但这从来不是OP要求的一部分,您可以测试
first\u valid\u index()
是否返回
None
alsoI我相信
first\u valid\u index()
返回的是实际的索引值,而不是索引号。。。因此,如果您希望使用
.loc
而不是
.iloc
,请纠正我的错误。我同意@wkzhu,例如,如果索引是DatetimeIndex,示例代码将失败。。一般的解决办法是我相信
s.loc[s.first\u valid\u index():]
@DavidWaterworth我现在更新了我的答案,我同意.loc更适合一般情况
In [219]: A = pd.Series([np.nan, np.nan, np.nan, 1, 2, np.nan, 3])

In [220]: A
Out[220]: 
0   NaN
1   NaN
2   NaN
3     1
4     2
5   NaN
6     3
dtype: float64

In [221]: A[np.where(~np.isnan(A))[0][0]:]       # Approach 1
Out[221]: 
3     1
4     2
5   NaN
6     3
dtype: float64

In [222]: A[np.maximum.accumulate(~np.isnan(A))]  # Approach 2
Out[222]: 
3     1
4     2
5   NaN
6     3
dtype: float64