如何基于两个字典有条件地映射Pandas DataFrame列值?
Pandas 按条件选择映射字典实现列值转换
需求:对DataFrame的color列做条件映射,当category为'tv'时用tv_map,其他情况用radio_map,要求一次性完成,无需拆分合并。
示例数据
import pandas as pd df_test = pd.DataFrame({ 'category': ['tv', 'radio', 'tv', 'radio'], 'color': ['red', 'green', 'green', 'red'] }) tv_map = {'red': 'tv_red', 'green': 'tv_green'} radio_map = {'red': 'radio_red', 'green': 'radio_green'}
解决方案
方法1:修正apply实现
你原来的apply写法存在参数错误,修正后可直接使用:
df_test['new_col'] = df_test.apply( lambda x: tv_map.get(x['color'], x['color']) if x['category'] == "tv" else radio_map.get(x['color'], x['color']), axis=1 )
- 逐行判断
category值,选择对应映射字典 get方法保证当color不在字典中时,返回原值避免报错
方法2:向量化操作(推荐,性能更优)
使用numpy.where结合map实现向量化处理,比apply效率更高:
import numpy as np df_test['new_col'] = np.where( df_test['category'] == 'tv', df_test['color'].map(tv_map), df_test['color'].map(radio_map) )
- 直接对整列做映射,再通过条件选择结果,适合大数据量场景
方法3:loc赋值避免覆盖
你原来的代码第二次赋值会覆盖第一次结果,导致tv行的new_col为NaN,用loc分步赋值可解决:
# 先给所有行设置默认映射 df_test['new_col'] = df_test['color'].map(radio_map) # 再替换符合tv条件的行 df_test.loc[df_test['category'] == 'tv', 'new_col'] = df_test.loc[df_test['category'] == 'tv', 'color'].map(tv_map)
最终结果
运行上述任意方法后,df_test结果如下:
category color new_col 0 tv red tv_red 1 radio green radio_green 2 tv green tv_green 3 radio red radio_red
内容的提问来源于stack exchange,提问作者shsh
相关产品推荐
相关产品推荐

