如何基于多列值映射生成Pandas DataFrame新列?
Pandas按不同字典映射多列生成统一列的简洁实现
问题场景
现有如下Pandas DataFrame:
import pandas as pd df = pd.DataFrame({'Event1': ['Music', 'Something else 1', 'Theatre', 'Comedy'], 'Event2': ['Something else 2', 'Ballet', 'Something else 3', '4'], 'Cost': [10000, 5000, 15000, 2000]})
需按以下字典分别映射Event1和Event2列:
dict1 = {'Music': 'M', 'Cooking': 'C', 'Theatre': 'T', 'Comedy': 'C'} dict2 = {'Ballet': 'B', 'Swimming': 'S'}
已知每行仅有一列的值可完成映射,需将映射结果存入新的Event列,最终期望得到如下结果:
# 目标输出 result = pd.DataFrame({'Event1': ['Music', 'Something else 1', 'Theatre', 'Comedy'], 'Event2': ['Something else 2', 'Ballet', 'Something else 3', '4'], 'Event': ['M', 'B', 'T', 'C'], 'Cost': [10000, 5000, 15000, 2000]})
简洁实现方法
方法1:apply结合字典get
逐行处理,优先从Event1取映射值,取不到则从Event2取:
df['Event'] = df.apply(lambda row: dict1.get(row['Event1']) or dict2.get(row['Event2']), axis=1)
方法2:映射后填充空值
先分别生成两列的映射结果,再用fillna合并非空值:
# 生成各列映射结果 event1_map = df['Event1'].map(dict1) event2_map = df['Event2'].map(dict2) # 合并结果,空值用另一列的映射值填充 df['Event'] = event1_map.fillna(event2_map)
这两种方法均为Pandas惯用写法,简洁高效,无需冗余的条件判断逻辑。
内容的提问来源于stack exchange,提问作者koteletje
相关产品推荐
相关产品推荐

