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



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

例如

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...

任何帮助都非常感谢!

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

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])

最新更新