如何以缺失值为分隔符分组列表并混合整数与字符串数据
解决:以NaN为分隔符合并非NaN的整数与字符串分组
承接Stack Overflow问题《I want to group data in a list with missing values as delimiter》,现有如下示例数据:
data = [1, 2, 3, nan, nan, nan, 4, 5, 6, nan, nan, 7, nan, 8, 9, nan, 0, 0, 'hello']
原代码及问题
使用以下代码尝试分组:
from math import nan from itertools import groupby data = [1, 2, 3, nan, nan, nan, 4, 5, 6, nan, nan, 7, nan, 8, 9, nan, 0, 0, 'hello'] g = groupby(data, key=type) # 按数据类型分组,int与float类型不同 groups = [list(a[1]) for a in g if a[0] != float] print(groups)
得到结果:
[[1, 2, 3], [4, 5, 6], [7], [8, 9], [0, 0], ['hello']]
但期望将末尾的整数与字符串合并为一组,目标结果:
[[1, 2, 3], [4, 5, 6], [7], [8, 9], [0, 0, 'hello']]
尝试调整过滤条件groups = [list(a[1]) for a in g if a[0] != float or a[0] == str]无效,因为groupby已按type把int和str拆分成独立组,后续过滤无法合并已拆分的组。
解决方案
修改groupby的分组规则,不再按元素类型分组,而是将NaN作为分隔标记,连续的非NaN元素归为同一组:
from math import nan from itertools import groupby import math data = [1, 2, 3, nan, nan, nan, 4, 5, 6, nan, nan, 7, nan, 8, 9, nan, 0, 0, 'hello'] # 自定义key:标记元素是否为NaN,连续非NaN元素会被归为同一组 g = groupby(data, key=lambda x: math.isnan(x) if isinstance(x, float) else False) # 过滤掉NaN对应的组,收集非NaN组的元素 groups = [list(group) for key, group in g if not key] print(groups)
运行后得到期望结果:
[[1, 2, 3], [4, 5, 6], [7], [8, 9], [0, 0, 'hello']]
说明
自定义的key函数逻辑:
- 若元素是float类型,判断是否为NaN,是则返回
True,否则返回False - 非float类型的元素(int、str等)直接返回
Falsegroupby会将连续返回False的元素分到同一组,NaN返回的True则作为分组分隔符,最终过滤掉NaN组即可得到目标分组结果。
内容的提问来源于stack exchange,提问作者Erwin
相关产品推荐
相关产品推荐

