如何用Python识别Excel列中值的多个超集与子集并导出结果
从Excel的letter列识别子集与超集并导出结果
需求说明
现有Excel数据(结构如下),需要识别letter列中的子集与超集关系,并将子集-超集对应关系、去重后的超集列表分别导出为两个独立的Excel文件:
原始数据
| id | letter |
|---|---|
| 1 | A, B, D, E, F |
| 2 | B, C |
| 3 | B |
| 4 | D, B |
| 5 | B, D, A |
| 6 | X, Y, Z |
| 7 | X, Y |
| 8 | E, D |
| 7 | G |
| 8 | G |
规则与预期输出
- 子集判断规则:若集合A的所有元素都包含在集合B中,则A是B的子集(包括自身)
- 预期输出1(子集-超集关系表):按超集分组,先列出超集行,再列出其所有子集行
- 预期输出2(超集列表):去重后的所有最大集合(无其他集合能完全包含它)
实现代码(Python + Pandas)
import pandas as pd # 读取原始Excel文件,替换为你的文件路径 df = pd.read_excel("原始数据.xlsx") # 预处理:将letter列转换为集合,方便子集/超集判断 df['letter_set'] = df['letter'].apply(lambda x: set([s.strip() for s in x.split(',')])) # 识别所有超集:无其他集合能完全包含当前集合,且去重相同letter supersets = [] seen_letters = set() for idx, row in df.iterrows(): current_set = row['letter_set'] current_letter = row['letter'] is_superset = True # 检查是否存在其他集合包含当前集合 for other_set in df['letter_set']: if current_set != other_set and other_set.issuperset(current_set): is_superset = False break if is_superset and current_letter not in seen_letters: supersets.append(row) seen_letters.add(current_letter) # 生成超集列表DataFrame superset_df = pd.DataFrame(supersets)[['id', 'letter']] # 生成子集-超集关系表 relation_rows = [] for sup in supersets: sup_set = sup['letter_set'] # 先添加超集本身 relation_rows.append({'id': sup['id'], 'letter': sup['letter']}) # 添加所有属于该超集的子集(排除当前超集行) for idx, row in df.iterrows(): if row['letter_set'].issubset(sup_set) and row.name != sup.name: relation_rows.append({'id': row['id'], 'letter': row['letter']}) relation_df = pd.DataFrame(relation_rows) # 导出到Excel文件 relation_df.to_excel("子集-超集关系表.xlsx", index=False) superset_df.to_excel("超集列表.xlsx", index=False) print("文件导出完成!")
代码说明
- 数据预处理:将
letter列的字符串按逗号分割并转换为集合,利用集合的issubset和issuperset方法快速判断子集/超集关系 - 超集识别:遍历每一行,检查是否存在其他集合完全包含当前集合,不存在则判定为超集,同时去重相同的
letter值 - 关系表生成:对每个超集,先添加超集行,再添加所有属于该超集的子集行,保证结构符合预期
- 导出文件:将两个结果分别导出为Excel,不保留索引列
内容的提问来源于stack exchange,提问作者abcabc
相关产品推荐
相关产品推荐

