如何用ChainMap实现DataFrame的一对多映射并展开多行?
实现一对多映射并展开DataFrame行
你当前使用ChainMap的方式只能获取每个code匹配到的第一个映射值,无法捕获所有关联的映射关系。要实现一对多映射并将每个关系展开为单独行,需要先构建多值映射字典,再通过pandas的explode方法展开行。
解决方案代码
from collections import defaultdict import pandas as pd # 定义原始映射规则:(code列表, 对应标签) mapping_rules = [ (['a', 'b', 'c'], 'A'), (['a', 'c', 'd'], 'B'), (['d', 'e', 'f'], 'C') ] # 构建多值映射字典:每个code对应所有关联的标签 multi_mapping = defaultdict(list) for codes, label in mapping_rules: for code in codes: multi_mapping[code].append(label) # 原始DataFrame df = pd.DataFrame({'code': ['a', 'b', 'c', 'd', 'e', 'f'], 'value': [1, 2, 3, 4, 5, 6]}) # 为每个code匹配所有关联标签(结果为列表) df['mapping'] = df['code'].map(multi_mapping) # 将列表展开为单独行,重置索引 df = df.explode('mapping').reset_index(drop=True) print(df)
输出结果
code value mapping 0 a 1 A 1 a 1 B 2 b 2 A 3 c 3 A 4 c 3 B 5 d 4 B 6 d 4 C 7 e 5 C 8 f 6 C
注:你期望结果中
e有两行C,但根据原始映射规则,e仅关联C一次,因此实际输出中e对应一行。如果需要重复行,可以在构建multi_mapping时手动添加重复标签,或后续对指定行进行复制。
内容的提问来源于stack exchange,提问作者cwohlfart
相关产品推荐
相关产品推荐

