如何快速提取数组中冒号组合的唯一基础元素?Python有无内置方法?
拆分组合元素提取唯一基础项的解决方案
问题描述
给定一个来自DataFrame某一列的唯一值NumPy数组:
import numpy as np input_array = np.array([np.nan, 'Stressful day', 'Drank coffee:Drank tea', 'Drank tea', 'Ate late:Drank coffee', 'Drank coffee:Drank tea:Worked out', 'Drank tea:Worked out', 'Drank coffee:Drank tea:Stressful day', 'Drank coffee', 'Drank coffee:Drank tea:Stressful day:Worked out', 'Drank coffee:Worked out', 'Ate late:Drank coffee:Drank tea', 'Ate late:Drank coffee:Drank tea:Worked out', 'Drank tea:Stressful day', 'Drank tea:Stressful day:Worked out', 'Drank coffee:Stressful day:Worked out', 'Drank coffee:Stressful day', 'Ate late:Drank coffee:Drank tea:Stressful day', 'Worked out', 'Ate late:Drank coffee:Worked out'], dtype=object)
数组中存在以冒号:拼接的组合元素(例如'Drank coffee:Drank tea'是两个基础元素的组合),需要提取所有唯一的基础元素,预期输出为:
array([nan, 'Stressful day', 'Drank coffee', 'Drank tea', 'Ate late', 'Worked out'], dtype=object)
解决方案
内置函数说明
Python标准库、NumPy或Pandas中没有直接处理这类需求的内置函数,但可以通过字符串拆分、去重结合数组/数据框操作快速实现,其中向量化操作是效率最高的方案。
最快实现方式
方式1:NumPy直接操作数组
适合直接处理NumPy数组的场景,利用批量拆分和去重:
import numpy as np # 过滤NaN,拆分所有非NaN元素 non_nan_vals = input_array[~np.isnan(input_array)] split_elements = np.concatenate([val.split(':') for val in non_nan_vals]) # 提取唯一基础元素,补回原始NaN unique_bases = np.unique(split_elements) result = np.append(np.array([np.nan]), unique_bases).astype(object) print(result)
方式2:Pandas链式操作(原数据来自DataFrame时更便捷)
如果原始数据是DataFrame的列,用Pandas的字符串拆分+展开+去重,代码更简洁:
import pandas as pd import numpy as np # 假设原DataFrame为df,目标列为'col' df = pd.DataFrame({'col': input_array}) # 拆分、展开后提取唯一值 unique_bases = df['col'].str.split(':', expand=True).stack().unique() # 补回NaN并转换类型 result = np.append(np.array([np.nan]), unique_bases).astype(object) print(result)
效率对比
两种方法都采用批量/向量化操作,避免了低效的循环遍历,在大规模数据下性能表现优异。其中Pandas的写法更简洁直观,适合DataFrame场景;NumPy的方式则更直接,适合纯数组操作场景。
内容的提问来源于stack exchange,提问作者Kanishk
相关产品推荐
相关产品推荐

