我有一个大数据集(2m行,70个变量),它有许多分类变量。所有分类变量都以数字编码(例如参见df1)
df1:
obs gender job
1 1 1
2 1 2
3 2 2
4 1 1
我有另一个包含所有解释的数据框,如下所示:
df2:
Var: Value: Label:
gender 1 male
gender 2 female
job 1 blue collar
job 2 white collar
是否有一种快速的方法可以用df2中的标签替换分类列的所有值?这样可以省去我总是查找df2中值的含义的工作。我找到了一些手动替换值的解决方案,但我寻找一种自动方式来做到这一点。
谢谢
答案 0 :(得分:1)
您可以使用从 df2 生成的词典。像这样:
首先,生成一些虚拟数据:
df = pd.read_excel('file.xlsx', dtype={'Col1': np.int8})
如果你想替换一个像这样的变量:
import pandas as pd
import numpy as np
df1 = pd.DataFrame()
df1['obs'] = range(1,1001)
df1['gender'] = np.random.choice([1,2],1000)
df1['job'] = np.random.choice([1,2],1000)
df2 = pd.DataFrame()
df2['var'] = ['gender','gender','job','job']
df2['value'] = [1,2,1,2]
df2['label'] = ['male','female','blue collar', 'white collar']
如果你想替换一堆变量:
genderDict = dict(df2.loc[df2['var']=='gender'][['value','label']].values)
df1['gender_name'] = df1['gender'].apply(lambda x: genderDict[x])
对于一百万行,它需要大约1秒,所以应该合理快速。
答案 1 :(得分:1)
使用groupby从df2创建一个映射器字典
OneHotEncoder
现在使用字典的外键作为列映射df1中的值,内部字典是映射器
LabelEncoder
你得到了
d = df2.groupby('Var').apply(lambda x: dict(zip(x['Value'], x['Label']))).to_dict()
{'gender': {1: 'male', 2: 'female'},
'job': {1: 'blue collar', 2: 'white collar'}}