You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于两个字典有条件地映射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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 22:13:17