如何基于带条件的键将字典映射至Pandas DataFrame?
解决方案:用自定义类模拟字典实现条件匹配映射
因为普通字典只能做精确键匹配,要实现范围条件的映射,你可以自定义一个类来模拟字典的行为——只要实现__getitem__方法,就能像普通字典一样被apply或map调用,完全满足下游必须用字典的要求。
步骤1:先回顾你的等值映射示例
先构造你提到的示例DataFrame,并用元组键完成等值映射:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'F1': ['Y', 'N', 'Y', 'N', 'N'], 'F2': ['A', 'B', 'A', 'B', 'C'], 'F3': [1000, 3000, 20000, 10000, 16000] }) # 等值映射字典(元组作为键) eq_map_dict = {('Y', 'A'): 1.0, ('N', 'B'): 0.9} df['等值映射列'] = df.apply(lambda row: eq_map_dict.get((row['F1'], row['F2']), None), axis=1)
步骤2:自定义条件映射的"字典"
创建一个类,在__getitem__方法里加入你需要的条件判断逻辑,这样它就能像字典一样被访问:
class ConditionalMapDict: def __getitem__(self, key): f1_val, f3_val = key # 实现你的目标条件:F1='N' 且 2000 < F3 < 15000 if f1_val == 'N' and 2000 < f3_val < 15000: return 1.1 # 其他情况返回None(或你需要的默认值) return None # 实例化这个类,当作字典使用 cond_map_dict = ConditionalMapDict() # 生成F1和F3的元组键,然后映射 df['条件映射列'] = df.apply(lambda row: cond_map_dict[(row['F1'], row['F3'])], axis=1)
步骤3:(可选)整合等值+条件映射
如果需要同时处理等值匹配和条件匹配,可以把两种逻辑整合到同一个类里:
class MixedMapDict: def __init__(self, eq_dict): self.eq_dict = eq_dict # 传入之前的等值映射字典 def __getitem__(self, key): # 先检查是否匹配等值键 if key in self.eq_dict: return self.eq_dict[key] # 再处理条件匹配(这里注意键的结构要对应,比如F1+F3) if len(key) == 2 and isinstance(key[1], (int, float)): f1_val, f3_val = key if f1_val == 'N' and 2000 < f3_val < 15000: return 1.1 # 默认返回None return None # 整合两种映射逻辑 mixed_map = MixedMapDict(eq_map_dict) # 根据需要选择不同的键组合 df['混合映射列'] = df.apply( lambda row: mixed_map[(row['F1'], row['F2'])] if (row['F1'], row['F2']) in eq_map_dict else mixed_map[(row['F1'], row['F3'])], axis=1 )
这样处理后,你完全是在用"类字典"的结构实现映射,没有用loc或where,完全符合下游要求。
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

