IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python | Pandas | 多列映射匹配到新列 -> 正文阅读

[Python知识库]Python | Pandas | 多列映射匹配到新列

pandas | 映射匹配

基于一列或多列中的值,根据映射字典的键值对,得到新列
最后修改日期:2021年11月19日
Ps: 如果本文有给你一些启发或者帮助的话,麻烦帮忙点个收藏、关注或者赞呗 (≧▽≦)/



示例数据




一对一映射

mapping

原始数据

# example
print(data)

    '''
                A        Num    ...           B     priority     
0               Y        962    ...           P      Highest   
...           ...        ...    ...         ...          ...        
556             t         84    ...           F       Medium   
...           ...        ...    ...         ...          ...
560             t        193    ...           F          Low   
    '''

自定义字典

基于单列中的值,提出自定义字典。此例中,有自定义字典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)

    '''
                A    Num    ...        C
0               Y    962               P
...           ...    ...    ...      ...
556             t     84    ...   Others
...           ...    ...    ...      ...
560             t    193    ...   Others
    '''


多对一映射

apply

原始数据

# example
print(data)

    '''
                A        Num    ...           B     priority     
0               Y        962    ...           P      Highest   
...           ...        ...    ...         ...          ...        
556             t         84    ...           F       Medium   
...           ...        ...    ...         ...          ...
560             t        193    ...           F          Low   
    '''

自定义字典

基于多列中的值,提出自定义字典。此例中,有自定义字典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()   # <class 'list'>

	'''
print(len(MultiIndex))
53

print(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))
53

pprint(MultiIndex_to_C_Full)
{('AR', 'F'): 'N',
...
('Y', 'P'): 'P',
	'''

映射

经过完整字典将基于A和B列中的值映射到C列中相应的值。

data['C'] = data[['A', 'B']].apply(lambda x: MultiIndex_to_C_Full.get((x.A, x.B)), axis=1)
	'''
               A       Num   ...         B             C
...
3              Y       962  ...          P             P
...
566            t       193  ...          F             N
	'''

参考文章

写此文时有借鉴以下资源

参见Python | Pandas | 多索引 | 自定义排序

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-11-20 18:21:00  更:2021-11-20 18:23:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 0:28:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码