如何在列表中查找连续组而不是 NaN 值

How to find the groups of consecutives not NaN values in a list

提问人:grimad 提问时间:10/20/2023 最后编辑:grimad 更新时间:10/20/2023 访问量:39

问:

我正在寻找一种过滤方法,可以在列表中找到连续组而不是 NaN 值,并返回这些组的第一个和最后一个元素的索引。

例如,列表

[楠楠, 楠, 4, 63, 34, 楠, 楠, 楠, 234, 3, 楠]

应返回每个组的元组:

[[2,4],[8,9]]

我为 pandas dataFrames 制作了一个有效的函数,但我想知道是否有一个简单的方法:

def find_groups_indexes(db):
    groups_indexes = []
    for i in  range(len(db)-1):
        if db.iloc[i].isnull().all()==True and db.iloc[i+1].isnull().all()==False:
            subgroup=[i+1]
        if db.iloc[i].isnull().all()==False and db.iloc[i+1].isnull().all()==True:
            subgroup.append(i)
            groups_indexes.append(subgroup)
            subgroup=[]
    print('\ngroups = ', groups_indexes)
    return groups_indexes
Python Pandas 列表 筛选器

评论


答:

0赞 Lucas M. Uriarte 10/20/2023 #1

这应该是做这项工作:

  1. 首先找到数据不是 nan 的索引
  2. 然后查找您有多少个组
  3. 最终获取组的第一个和最后一个值
  4. if 语句确保仅添加多个 no nan 的序列 值。

短版

data=np.argwhere(~np.isnan(values)).flatten()
[[array[0], array[-1]] for array in np.split(data, np.where(np.diff(data) != 1)[0]+1) if array[0] != array[-1]]

长版:

data=np.argwhere(~np.isnan(values)).flatten()
group_data = np.split(data, np.where(np.diff(data) != 1)[0]+1)

solution = []
for array in group_data:
    if array[0] != array[-1]:
        indexes = [array[0], array[-1]]
        solution.append(indexes)