Python 如何获取熊猫系列下一个非NaN数的索引?

Python 如何获取熊猫系列下一个非NaN数的索引?,python,pandas,interpolation,Python,Pandas,Interpolation,在熊猫中,我现在正在循环一个系列的实例,当我遇到一个NaN时,我是否可以立即知道下一个非NaN的索引。我不想跳过那些NaN,因为我想对它们进行插值 e、 现在我有了一个带有元素的系列a 5, 6, 5, NaN, NaN, NaN, 7, 8, 9, NaN, NaN, NaN, 10, 10 它们的索引是从0到13,当我迭代序列时,我只想知道下一个NaN的索引是什么,下一个非NaN的索引是什么。所以从一开始,我能马上知道第一个NaN的指数是4吗?然后当我跳到[4]时,我需要知道下一个非NaN

在熊猫中,我现在正在循环一个系列的实例,当我遇到一个NaN时,我是否可以立即知道下一个非NaN的索引。我不想跳过那些NaN,因为我想对它们进行插值

e、 现在我有了一个带有元素的系列
a

5, 6, 5, NaN, NaN, NaN, 7, 8, 9, NaN, NaN, NaN, 10, 10
它们的索引是从0到13,当我迭代序列时,我只想知道下一个NaN的索引是什么,下一个非NaN的索引是什么。所以从一开始,我能马上知道第一个NaN的指数是4吗?然后当我跳到[4]时,我需要知道下一个非NaN数的索引,在本例中是6

非常感谢。

您可以使用该方法查找您拥有的
NaN
值的索引,然后在当前步骤中,您可以将您的索引与下一步进行比较:

In [48]: s.index[s.isnull()]
Out[48]: Int64Index([3, 4, 5, 9, 10, 11], dtype='int64')
您还可以使用查找第一个非
NaN
值,例如:

In [49]: s[4:]
Out[49]:
4    NaN
5    NaN
6      7
7      8
8      9
9    NaN
10   NaN
11   NaN
12    10
13    10
dtype: float64

In [50]: s[4:].first_valid_index()
Out[50]: 6
编辑

如果要创建整数索引,可以使用以下索引:

b = s[4:]

In [156]: b
Out[156]:
4    NaN
5    NaN
6      7
7      8
8      9
9    NaN
10   NaN
11   NaN
12    10
13    10
dtype: float64

In [157]: b.first_valid_index()
Out[157]: 6

In [158]: b.index.get_loc(b.first_valid_index())
Out[158]: 2
EDIT2

您可以使用来获取具有
NaNs
且具有有效值的所有索引:

import string
s = pd.Series([5, 6, 5, np.nan, np.nan, np.nan, 7, 8, 9, np.nan, np.nan, np.nan, 10, 10], index = list(string.ascii_letters[:len(s.index)]))

In [216]: s
Out[216]:
a     5
b     6
c     5
d   NaN
e   NaN
f   NaN
g     7
h     8
i     9
j   NaN
k   NaN
l   NaN
m    10
n    10
dtype: float64

valid_indx = s.index.get_indexer(s.index[~s.isnull()])
nan_indx = s.index.get_indexer(s.index[s.isnull()])

In [220]: valid_indx
Out[220]: array([ 0,  1,  2,  6,  7,  8, 12, 13])

In [221]: nan_indx
Out[221]: array([ 3,  4,  5,  9, 10, 11])    
或者最简单的方法是:


非常感谢。我可以得到整数索引而不是我自己定义的索引吗?@xxx222我想你可以做
reset\u index(drop=True)
让你的索引从0开始。或者你还需要其他的索引吗?是的,然后我想返回一个插值序列(所以我想保留这些索引)。谢谢!我仍然想问,有什么方法可以在两个非整数索引之间进行计算?因为在这种情况下,获取第一个有效索引的整数位置不允许我计算NaN间隔的距离。@xxx222另一次尝试。。。查看
np.where
In [222]: np.where(s.isnull())
Out[222]: (array([ 3,  4,  5,  9, 10, 11], dtype=int32),)

In [223]: np.where(~s.isnull())
Out[223]: (array([ 0,  1,  2,  6,  7,  8, 12, 13], dtype=int32),)