我希望能最好地了解如何使用第二个文件/数据帧有效地映射值(当这些值以编码方式提供,并且有一个标签要映射到它时)。将第二个文件视为一个数据字典,可以转换第一个数据帧中的值。
例如
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...
非常感谢您的帮助!
答案 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])