Python,Pandas:获得列表中第一个None位置的最佳方法,该位置给出最大的连续None计数

Res*_*per 3 python numpy pandas python-3.6

我有包含None如下列表的列表。

l1 = [None, 1, None, None, 2, None, None]
l2 = [None, 1, 1, None, None, None, 2, None, None]
Run Code Online (Sandbox Code Playgroud)

我想None在此列表中获得第一个位置,该位置给出最大的连续 None计数。

get_start_None_pos(l1) # should return 2
get_start_None_pos(l2) # should return 3
Run Code Online (Sandbox Code Playgroud)

我目前使用Pandas的方法效果很好,但是当我要处理的列表太多时,速度太慢。

def get_start_None_pos(l: list) -> int:
    s = pd.Series(l)
    s = s.isna()
    s = s.cumsum() - s.cumsum().where(~s).ffill().fillna(0)
    return int(s.idxmax() - s.max() + 1)
Run Code Online (Sandbox Code Playgroud)

我想知道,有没有更好的办法来解决这样的问题?

Div*_*kar 5

这是NumPy的一个-

def maxconsecNone_start(l):
    a = np.isnan(np.asarray(l, dtype=np.float64))
    a1 = np.r_[False,a,False]
    idx = np.flatnonzero(a1[:-1] != a1[1:])
    return idx[2*(idx[1::2]-idx[::2]).argmax()]
Run Code Online (Sandbox Code Playgroud)

样品运行-

In [49]: l1
Out[49]: [None, 1, None, None, 2, None, None]

In [50]: l2
Out[50]: [None, 1, 1, None, None, None, 2, None, None]

In [51]: maxconsecNone_start(l1)
Out[51]: 2

In [52]: maxconsecNone_start(l2)
Out[52]: 3
Run Code Online (Sandbox Code Playgroud)