使用字典.update()与pd.Series更新Pandas列失败,求问题排查
问题原因
你代码里的update方法未生效的核心问题是索引不匹配:
pd.Series(term_dict)生成的Series,其索引是字典的键(即' 36 months'、' 60 months')- 原DataFrame的
term_int列使用的是默认数字索引(0、1、2...) update方法是按索引对齐来替换值的,两者索引完全不重合,因此找不到需要替换的行,term_int列自然没有变化。
正确解决方案
方案1:用map方法(最适配你的场景)
map方法会直接根据列的每个值匹配字典的键并返回对应值,完全无需考虑索引问题:
import pandas as pd import re loan_data = pd.read_csv('loan_data_2007_2014.csv') term_set = set(loan_data['term']) term_dict = {x: int(re.sub('[^0-9]', '', x)) for x in term_set} # 直接用map完成替换 loan_data['term_int'] = loan_data['term'].map(term_dict) print("unique term_int = ", loan_data['term_int'].unique())
方案2:直接提取数字(更简洁,无需构建字典)
不需要提前创建字典,用字符串提取方法直接提取数字部分,一步到位:
import pandas as pd loan_data = pd.read_csv('loan_data_2007_2014.csv') # 提取数字并转为整数类型 loan_data['term_int'] = loan_data['term'].str.extract('(\d+)').astype(int) print("unique term_int = ", loan_data['term_int'].unique())
方案3:修复update的索引匹配(仅作原理演示,不推荐)
如果一定要使用update,需要让Series的索引与原DataFrame索引对齐,通过临时设置索引实现:
import pandas as pd import re loan_data = pd.read_csv('loan_data_2007_2014.csv') term_set = set(loan_data['term']) term_dict = {x: int(re.sub('[^0-9]', '', x)) for x in term_set} loan_data['term_int'] = loan_data['term'] # 临时将term列设为索引,让update能匹配对应值 loan_data.set_index('term', inplace=True) loan_data['term_int'].update(pd.Series(term_dict)) # 恢复原索引 loan_data.reset_index(inplace=True) print("unique term_int = ", loan_data['term_int'].unique())
内容的提问来源于stack exchange,提问作者JohnSmith
相关产品推荐
相关产品推荐

