如何在Pandas中高效为DataFrame添加/替换来自另一DataFrame的数值评分
优化信用评级转数值评分的方法
别再用多次pd.merge了,直接用映射字典+map方法更简便高效,代码清晰还能避免中间数据混乱。
具体实现步骤:
- 重构信用评级的映射关系,直接生成各评级机构到分数的字典
- 用
map方法一键转换原DataFrame中的评级列,生成对应的分数列
完整代码示例
import pandas as pd df = pd.DataFrame( { 'name' : ['ABC'], 'Moodys' :['Aa3'], 'SNP' : ['AA'], 'Fitch' : ['A']}) # 定义评级与分数的对应关系 credit_score_mapping = [ (10, ['AAA', 'Aaa']), (9, ['AA+', 'Aa1']), (8, ['AA', 'Aa2']), (7, ['AA-', 'Aa3']), (6, ['A+', 'A1']), (5, ['A', 'A2']), (4, ['A-', 'A3']), (3, ['BBB+', 'Baa1']), (2, ['BBB', 'Baa2']), (1, ['BBB-', 'Baa3']), (-1, ['BB+', 'Ba1']), (-2, ['BB', 'Ba2']), (-3, ['BB-', 'Ba3']), (-4, ['B+', 'B1']), (-5, ['B', 'B2']), (-6, ['B-', 'B3']) ] # 生成各机构的评分映射字典 snp_fitch_map = {} moodys_map = {} for score, ratings in credit_score_mapping: snp_fitch_map[ratings[0]] = score # SNP和Fitch的评级格式一致 moodys_map[ratings[1]] = score # Moodys是单独的评级格式 # 直接在原DataFrame添加评分列 df['Moodys_score'] = df['Moodys'].map(moodys_map) df['SNP_score'] = df['SNP'].map(snp_fitch_map) df['Fitch_score'] = df['Fitch'].map(snp_fitch_map) print(df)
输出结果
name Moodys SNP Fitch Moodys_score SNP_score Fitch_score 0 ABC Aa3 AA A 7 8 5
为什么这个方法更好?
- 代码简洁:不需要生成中间DataFrame,也不会出现
Fitch_x这类混乱的列名 - 性能更高:
map是Pandas的向量化操作,比多次merge的效率高得多,数据量越大优势越明显 - 逻辑清晰:直接构建映射关系,一眼就能看懂各评级对应的分数,后续维护也方便
如果担心有未匹配的评级(比如出现不在映射里的取值),可以用fillna处理缺失值,或者换成replace方法,效果一致:
df['Moodys_score'] = df['Moodys'].replace(moodys_map).fillna(-99) # 用-99标记未匹配的评级
内容的提问来源于stack exchange,提问作者user3685918
相关产品推荐
相关产品推荐

