pandas | 映射匹配 基于一列或多列中的值,根据映射字典的键值对,得到新列
最后修改日期:2021年11月19日
Ps: 如果本文有给你一些启发或者帮助的话,麻烦帮忙点个收藏、关注或者赞呗 (≧▽≦)/
映射匹配
- pandas | 映射匹配
- 示例数据
- 一对一映射
-
- mapping
-
- 原始数据
- 自定义字典
- 完整字典
-
- 完整键
- 完整字典
- 映射
- 多对一映射
-
- apply
-
- 原始数据
- 自定义字典
-
- 字典A
- 字典B
- 完整字典
-
- 完整键
- 完整字典
- 映射
- 参考文章
示例数据
一对一映射 mapping 原始数据
# example
print(data)'''
ANum...Bpriority
0Y962...PHighest
..................
556t84...FMedium
..................
560t193...FLow
'''
自定义字典
基于单列中的值,提出自定义字典。此例中,有自定义字典1个,键为A列中的值,值为被映射到C列中相应的值。
# key, 'A';
value, 'C';
mapping 'A' values to 'C' values
A_to_C_Short = {
...
('Y', ...): 'P',
...
(..., 't'): 'Others'
}# len(A_to_C_Short.keys()) = 6'''
m = 0
for n in A_to_C_Short.keys():
m += len(n)
# m = 26
# there are 26 values in total
'''
完整字典
完整键 键为A列中的值。
# 'A'
A = data.groupby('A').agg('sum').index.to_list()# len(A) = 49'''
['A', 'B', ...]
'''
完整字典 键为A列中的值,值为经过字典映射后理应被映射到C列中相应的值。
# primary mapping: mapping 'A' items in 'A' col to get a A_to_C full dict
A_to_C_Full = {}
for i in A:
for j in A_to_C_Short:
if i in j:
A_to_C_Full[i] = A_to_C_Short[j]'''
print(A_to_C_Full):
{..., 'Y': 'P', ..., 't': 'Others', ...}print(len(A_to_C_Full))
26
'''
映射
经过完整字典将基于A列中的值映射到C列中相应的值。
# secondary mapping: mapping 'A' values in 'A' col to new values in 'C' col by A_to_C_Full dict
data['C'] = data['A'].map(A_to_C_Full).fillna(0)'''
ANum...C
0Y962P
...............
556t84...Others
...............
560t193...Others
'''
多对一映射 apply 原始数据
# example
print(data)'''
ANum...Bpriority
0Y962...PHighest
..................
556t84...FMedium
..................
560t193...FLow
'''
自定义字典
基于多列中的值,提出自定义字典。此例中,有自定义字典2个,键为A或B列中的值,值为被映射到C列中相应的值。
字典A 键为A列中的值,值为被映射到C列中相应的值。
# key, 'A';
value, 'C';
mapping 'A' values to 'C' values
A_to_C_Short = {
...
('Y', ...): 'P',
...
(..., 't'): 'Others'
}# len(A_to_C_Short.keys()) = 6'''
m = 0
for n in A_to_C_Short.keys():
m += len(n)
# m = 26
# there are totally 26 items in 6 keys
'''
字典B 键为B列中的值,值为被映射到C列中相应的值。
# key, 'B';
value, 'C';
mapping 'B' values to 'C' values
B_to_C_Short = {
'P': 'P',
('A', 'F', 'H', 'R', 'None', 'F'): 'N'
}
完整字典
完整键 键为A列与B列中的值组成的元组。
# 'A' & 'B' multi index in the format of tuple
MultiIndex = data.groupby(['A', 'B']).agg('sum').index.to_list()# '''
print(len(MultiIndex))
53print(MultiIndex)
[('AR', 'F'), ('BW', 'P'), ('CW', 'P'), ...]
'''
完整字典 键为A列与B列中的值组成的元组,值为经过字典A和字典B映射后理应被映射到C列中相应的值。
# based on tuple values in 'A' col and 'B' col, and user define dicts,
# get a A & B col to C col mapping dict
MultiIndex_to_C_Full = {}
for i in MultiIndex:# i, e.g. ('AR', 'F')
for j in A_to_C_Short:# j, e.g. ('Y', ...)
for k in B_to_C_Short:# k, e.g. ('A', 'F', 'H', 'R', 'None', 'F')
if k == 'P':
if i[1] == k and i[0] in j:
MultiIndex_to_C_Full[i] = A_to_C_Short[j]
else:
if i[1] in k and i[0] not in j:
MultiIndex_to_C_Full[i] = B_to_C_Short[k] '''
print(len(MultiIndex_to_C_Full))
53pprint(MultiIndex_to_C_Full)
{('AR', 'F'): 'N',
...
('Y', 'P'): 'P',
'''
映射
【数据分析|Python | Pandas | 多列映射匹配到新列】经过完整字典将基于A和B列中的值映射到C列中相应的值。
data['C'] = data[['A', 'B']].apply(lambda x: MultiIndex_to_C_Full.get((x.A, x.B)), axis=1)
'''
ANum...BC
...
3Y962...PP
...
566t193...FN
'''
参考文章 写此文时有借鉴以下资源
…
参见Python | Pandas | 多索引 | 自定义排序
推荐阅读
- 上榜中国大数据企业50强,思迈特软件再夺多项荣誉
- python|victoriametrics的prometheus高可用性和容错策略长期存储
- 事物序列化_大规模测量每件事物m3时间序列简介
- 计算机视觉|ECCV2022|何恺明团队开源ViTDet(只用普通ViT,不做分层设计也能搞定目标检测...)
- Python|数据分析(实战模拟)
- Python的模块调用
- 计算机视觉|计算机视觉 图像基本操作
- opencv|图像基础入门--图像基本操作
- python|opencv图像处理及视频处理基本操作