【问题标题】:How can I get the index of next non-NaN number with series in pandas?如何在熊猫系列中获取下一个非 NaN 数的索引?
【发布时间】:2023-03-26 03:20:01
【问题描述】:

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

例如,现在我有一个带有元素的系列 a

5, 6, 5, NaN, NaN, NaN, 7, 8, 9, NaN, NaN, NaN, 10, 10

它们的索引是从 0 到 13,当我迭代系列时,什么时候只想知道下一个 NaN 的索引是什么,下一个非 NaN 是什么。那么从一开始,我能立即知道第一个 NaN 的索引是 4 吗?那么当我跳转到 a[4] 时,我需要知道下一个非 NaN 数的索引,在本例中为 6。

非常感谢。

【问题讨论】:

    标签: python pandas interpolation


    【解决方案1】:

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

    In [48]: s.index[s.isnull()]
    Out[48]: Int64Index([3, 4, 5, 9, 10, 11], dtype='int64')
    

    您也可以使用first_valid_index 查找第一个非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
    

    编辑

    如果你想要一个整数索引,你可以使用熊猫索引中的get_loc

    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

    您可以使用get_indexer 来获取您拥有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])    
    

    或者最简单的方法是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),)
    

    【讨论】:

    • 谢谢!我可以得到整数索引而不是自己定义的索引吗?
    • @xxx222 我认为您可以使用reset_index(drop=True) 使您的索引从 0 开始。或者您还需要该索引来做其他事情吗?
    • 是的,然后我想返回一个插值系列(所以我想保留这些索引)。
    • 谢谢!而且我还想问有没有什么方法可以计算两个非整数索引之间的?因为在这种情况下,获取第一个有效索引的整数位置不允许我计算 NaN 间隙的距离。
    • @xxx222 又一次尝试...看看np.where
    猜你喜欢
    • 2021-05-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多