首页 > 解决方案 > 如何使用 Pandas 数据框的常用键填充多个字典?

问题描述

我有一个字典列表,其中键相同但每个字典中的值不相同,并且每个字典的顺序都严格保留。我正在尝试找到一种自动解决方案来将这些字典作为新列填充到 pandas 数据框,但没有得到预期的输出。

有关要点的原始数据

这是我在 gist 上的旧数据上的数据

我的尝试

这是我尝试用相同的键但不同的值(二进制值)填充多个字典,我的目标是我想写下方便的函数来矢量化代码。这是我效率低下的代码,但适用于要点

import pandas as pd

dat= pd.read_csv('old_data.csv', encoding='utf-8')

dat['type']=dat['code'].astype(str).map(typ)
dat['anim']=dat['code'].astype(str).map(anim)
dat['bovin'] = dat['code'].astype(str).map(bov)
dat['catg'] = dat['code'].astype(str).map(cat)
dat['foot'] = dat['code'].astype(str).map(foo)

我的代码有效,但没有矢量化(我认为效率不高)。我想知道如何使这几行简单的功能。任何想法?我们如何尽可能有效地做到这一点?

这是我当前和所需的输出:

因为我得到了正确的输出,但这里的代码效率不高。这是我目前在gist上的输出

标签: pythonpandas

解决方案


如果您将字典重组为字典字典,则可以将其排成一行:

 for keys in values.keys():
        dat[keys]=dat['code'].astype(str).map(values[keys])

完整代码:

values = {"typ" :{
    '20230' : 'A',
    '20130' : 'A',
    '20220' : 'A',
    '20120' : 'A',
    '20329' : 'A',
    '20322' : 'A',
    '20321' : 'B',
    '20110' : 'B',
    '20210' : 'B',
    '20311' : 'B'
    } ,

"anim" :{
    '20230' : 'AOB',
    '20130' : 'AOB',
    '20220' : 'AOB',
    '20120' : 'AOB',
    '20329' : 'AOC',
    '20322' : 'AOC',
    '20321' : 'AOC',
    '20110' : 'AOB',
    '20210' : 'AOB',
    '20311' : 'AOC'
    } ,

"bov" :{
    '20230' : 'AOD',
    '20130' : 'AOD',
    '20220' : 'AOD',
    '20120' : 'AOD',
    '20329' : 'AOE',
    '20322' : 'AOE',
    '20321' : 'AOE',
    '20110' : 'AOD',
    '20210' : 'AOD',
    '20311' : 'AOE'
    } ,

"cat" :{
    '20230' : 'AOF',
    '20130' : 'AOG',
    '20220' : 'AOF',
    '20120' : 'AOG',
    '20329' : 'AOF',
    '20322' : 'AOF',
    '20321' : 'AOF',
    '20110' : 'AOG',
    '20210' : 'AOF',
    '20311' : 'AOG'
    } ,

"foo" :{
    '20230' : 'AOL',
    '20130' : 'AOL',
    '20220' : 'AOM',
    '20120' : 'AOM',
    '20329' : 'AOL',
    '20322' : 'AOM',
    '20321' : 'AOM',
    '20110' : 'AOM',
    '20210' : 'AOM',
    '20311' : 'AOM'
    } 
}




import pandas as pd

dat= pd.read_csv('old_data.csv', encoding='utf-8')
for keys in values.keys():
    dat[keys]=dat['code'].astype(str).map(values[keys])

推荐阅读