如何根据Pandas DataFrame的STRATEGY列映射字典指定位置的值?
问题描述
现有如下Pandas DataFrame:
import pandas as pd data = [['BALANCED', 'Corp EUR'], ['YIELD', 'Corp USD'], ['GROWTH', 'HG CHF']] df = pd.DataFrame(data, columns=['STRATEGY', 'ASSET_CLASS'])
对应的DataFrame输出:
STRATEGY ASSET_CLASS 0 BALANCED Corp EUR 1 YIELD Corp USD 2 GROWTH HG CHF
目标是根据STRATEGY列的值,从以下字典中提取对应位置的元素,生成TARGET列:
my_dict = {'HG CHF': [5, 2, 3, 4], 'Corp EUR': [4, 6, 8, 7], 'Corp USD': [9, 7.5, 5.3, 6], }
对应规则:
YIELD→ 列表第2个元素(索引1)BALANCED→ 列表第3个元素(索引2)GROWTH→ 列表第4个元素(索引3)
期望输出:
STRATEGY ASSET_CLASS TARGET 0 BALANCED Corp EUR 8.0 1 YIELD Corp USD 7.5 2 GROWTH HG CHF 4.0
当前使用df['TARGET'] = df['ASSET_CLASS'].map(my_dict)得到的是整个列表,请问如何正确获取字典中指定位置的值?
解决方案
方法1:逐行映射取值
先定义STRATEGY到索引的对应关系,再用apply逐行提取字典中对应位置的元素:
# 策略到列表索引的映射 strategy_idx_map = { 'YIELD': 1, 'BALANCED': 2, 'GROWTH': 3 } # 生成TARGET列 df['TARGET'] = df.apply(lambda row: my_dict[row['ASSET_CLASS']][strategy_idx_map[row['STRATEGY']]], axis=1)
方法2:批量映射后提取元素
先分别把ASSET_CLASS映射为对应列表、STRATEGY映射为对应索引,再通过列表推导式批量提取值:
strategy_idx_map = {'YIELD':1, 'BALANCED':2, 'GROWTH':3} # 批量获取列表和对应索引,再提取元素 df['TARGET'] = [lst[idx] for lst, idx in zip(df['ASSET_CLASS'].map(my_dict), df['STRATEGY'].map(strategy_idx_map))]
方法3:数据重塑合并(适合大规模数据)
如果数据量较大,apply效率偏低,可以将字典转换为DataFrame后合并,再提取对应列的值:
# 将字典转为DataFrame,重置索引为ASSET_CLASS dict_df = pd.DataFrame(my_dict).T.reset_index().rename(columns={ 'index':'ASSET_CLASS', 0:'col0', 1:'col1', 2:'col2', 3:'col3' }) # 策略到目标列名的映射 strategy_col_map = {'YIELD':'col1', 'BALANCED':'col2', 'GROWTH':'col3'} df['target_col'] = df['STRATEGY'].map(strategy_col_map) # 合并后提取对应列的值 df = df.merge(dict_df, on='ASSET_CLASS') df['TARGET'] = df.apply(lambda row: row[row['target_col']], axis=1) # 清理临时列 df = df.drop(columns=['col0','col1','col2','col3','target_col'])
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

