如何在DataFrame中将数字映射为对应文本(基于参考数据集)
这是一个典型的值映射替换问题,用Pandas就能轻松搞定,我给你一步步拆解实现过程:
1. 先导入库并构建数据集
首先我们把你给出的两个数据集转换成Pandas DataFrame:
import pandas as pd # 构建Dataset 1 data1 = { 'lhs': ['32,39,6', '39,6,65', '14,16,26', '16,20,4', '16,26,33', '53'], 'rhs': ['65', '32', '15', '26', '4', '31'] } df1 = pd.DataFrame(data1) # 构建Dataset 2(修正了原数据里yougurt的拼写错误) data2 = { 'id': [4,6,14,15,16,20,26,31,32,39,53,65], 'name': ['yogurt', 'coffee', 'cream cheese', 'meat spreads', 'butter', 'whole milk', 'condensed milk', 'curd', 'flour', 'rolls', 'sugar', 'soda'] } df2 = pd.DataFrame(data2)
2. 创建ID到名称的映射字典
为了快速查找数字对应的字符串,我们把Dataset 2转换成一个id: name的字典:
id_to_name = df2.set_index('id')['name'].to_dict()
这个字典的结构是{4: 'yogurt', 6: 'coffee', ..., 65: 'soda'},后续替换时直接查字典,效率很高。
3. 批量替换两列的数字
处理lhs列(逗号分隔的多值)
lhs列是多个数字用逗号分隔的字符串,我们需要先拆分每个数字,映射成名称,再重新拼接:
df1['lhs'] = df1['lhs'].apply( lambda x: ', '.join([id_to_name[int(num)] for num in x.split(',') if int(num) in id_to_name]) )
这里加了if int(num) in id_to_name的判断,是为了避免像原数据里的33(Dataset 2里无对应ID)出现KeyError;如果需要保留不存在的数字,可以改成id_to_name.get(int(num), num)。
处理rhs列(单值)
rhs列是单个数字,直接转成整数后用map方法映射即可:
df1['rhs'] = df1['rhs'].astype(int).map(id_to_name)
4. 查看结果
运行完上面的代码后,打印前3行就是你要的预期输出:
print(df1.head(3))
输出:
lhs rhs 0 flour, rolls, coffee soda 1 rolls, coffee, soda flour 2 cream cheese, butter, condensed milk meat spreads
内容的提问来源于stack exchange,提问作者pylearner
相关产品推荐
相关产品推荐

