如何在Pandas中基于现有列值从列表映射生成新列?
Pandas实现基于现有列值映射指定列表生成新列
问题场景与需求
初始示例代码:
values = [1,2,3,2,3,1] colors = ['r','g','b'] expected_output = ['r', 'g', 'b', 'g', 'b', 'r'] # 如何用Pandas实现这个? df = pd.DataFrame({'values': values}) df['colors'] = expected_output
我希望在DataFrame中新增一列,该列的取值基于现有列的值从指定列表中选取。曾在xarray中用向量化索引实现类似功能,但不确定Pandas中是否可行,这应该是基础索引任务。
目前找到的回答虽有可取之处,但过度依赖values的数值特性,我需要一种通用方法,同样适用于字符串类型的values场景:
values = ['a', 'b', 'c', 'b', 'c', 'a']
我猜测map方法或许适用。
通用解决方案
通过构建映射字典结合map(或replace)方法即可实现,完全不依赖values的类型,数值、字符串场景均适用:
核心步骤
- 建立
values唯一值与colors列表的对应字典 - 用映射方法将原列值转换为目标颜色值
示例代码
import pandas as pd # 场景1:数值型values values_num = [1,2,3,2,3,1] colors = ['r','g','b'] # 构建映射字典:确保values的唯一值与colors顺序匹配 value_color_map = dict(zip([1,2,3], colors)) df_num = pd.DataFrame({'values': values_num}) df_num['colors'] = df_num['values'].map(value_color_map) # 结果:df_num['colors'] = ['r', 'g', 'b', 'g', 'b', 'r'] # 场景2:字符串型values values_str = ['a', 'b', 'c', 'b', 'c', 'a'] str_color_map = dict(zip(['a','b','c'], colors)) df_str = pd.DataFrame({'values': values_str}) df_str['colors'] = df_str['values'].map(str_color_map) # 结果:df_str['colors'] = ['r', 'g', 'b', 'g', 'b', 'r']
替代方法:使用replace
效果与map一致,写法略有不同:
df_num['colors'] = df_num['values'].replace(value_color_map) df_str['colors'] = df_str['values'].replace(str_color_map)
注意事项
- 如果
values的唯一值顺序不确定,可先提取唯一值再排序后构建字典,比如dict(zip(sorted(set(values_num)), colors)) map和replace均为Pandas高效向量化操作,处理大数据集性能优异
内容的提问来源于stack exchange,提问作者Ben Farmer
相关产品推荐
相关产品推荐

