如何匹配DataFrame行值与字典并添加对应键为新列
实现DataFrame根据字典值匹配新增列的方法
要实现将DataFrame中User ID与字典值匹配后新增对应组名的需求,可通过以下几种高效方法完成:
方法1:构建反向映射字典(推荐)
原字典结构为组名: [用户ID列表],我们需要先将其转换为用户ID: 组名的反向映射,借助字典O(1)的查询效率快速完成匹配。
import pandas as pd group_ID = { 'Group A':[4738, 4812], 'Group B':[5888, 6551], 'Group C':[4487, 7888] } user_data = [['Alex',4812],['Bob',4487],['Clarke',5888]] sample_df = pd.DataFrame(user_data,columns=['Name','User ID']) # 构建反向映射字典 reverse_group = {} for group_name, id_list in group_ID.items(): for uid in id_list: reverse_group[uid] = group_name # 新增Group ID列 sample_df['Group ID'] = sample_df['User ID'].map(reverse_group) print(sample_df)
执行后输出:
Name User ID Group ID 0 Alex 4812 Group A 1 Bob 4487 Group C 2 Clarke 5888 Group B
这种方法适合处理大数据量的DataFrame,查询效率远高于遍历匹配。
方法2:直接使用replace函数
pandas.Series.replace同样支持字典映射,用法和map一致,效果相同:
# 复用已构建的reverse_group字典 sample_df['Group ID'] = sample_df['User ID'].replace(reverse_group)
方法3:无需构建反向字典的列表推导式
如果不想额外创建反向字典,可通过列表推导式遍历每个User ID并匹配对应组名:
sample_df['Group ID'] = [ next((group for group, ids in group_ID.items() if uid in ids), None) for uid in sample_df['User ID'] ]
其中next(..., None)表示若找不到匹配的ID,就返回None。不过该方法在字典的ID列表较长时,每次匹配都要遍历列表,效率低于前两种,适合小数据量场景。
内容的提问来源于stack exchange,提问作者Rob A
相关产品推荐
相关产品推荐

