从第二个数据帧有效地映射熊猫中的值

时间:2019-09-02 02:03:35

标签: python pandas

我希望能最好地了解如何使用第二个文件/数据帧有效地映射值(当这些值以编码方式提供,并且有一个标签要映射到它时)。将第二个文件视为一个数据字典,可以转换第一个数据帧中的值。

例如

import pandas as pd
dataset = pd.read_csv('https://gist.githubusercontent.com/seankross/a412dfbd88b3db70b74b/raw/5f23f993cd87c283ce766e7ac6b329ee7cc2e1d1/mtcars.csv') 

data_dictionary = pd.DataFrame({'columnname' : ['vs','vs', 'am','am'], 'code'  : [0,1,0,1], 'label':['vs_is_0','vs_is_1','am_is_0','am_is_1'] })

现在,我希望能够根据映射“代码”用准确的“标签”替换第一个数据集中“列名”中的值。如果在一个而不是另一个中找到一个值,则什么也没有发生。

目前,我的方法如下,但是我觉得它效率不高且不够理想。请记住,我可能有30-40列,每列都有2-200个值,我希望用此vlookup替换,例如替换:

 for each_colname in dataset.columns.tolist():
     lookup_values = data_dictionary.query("columnname=={}".format(each_colname))

     # and then doing a merge...

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

首先,您可以创建一个映射器字典,然后将其应用于数据集。

mapper = (
    data_dictionary.groupby('columnname')
    .apply(lambda x: dict(x.values.tolist()))
    .to_dict()
)

for e in mapper.keys():
    df[e] = df[e].map(mapper[e]).combine_first(df[e])

更新以处理不匹配的数据类型:

mapper = (
    data_dictionary.groupby('columnname')
    .apply(lambda x: dict(x.astype(str).values.tolist()))
    .to_dict()
)

for e in mapper.keys():
    df[e] = df[e].astype(str).map(mapper[e]).combine_first(df[e])