Python pandas:根据图例数据框标记分类值

时间:2018-02-22 13:29:59

标签: python pandas dataframe label

我有一个大数据集(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中值的含义的工作。我找到了一些手动替换值的解决方案,但我寻找一种自动方式来做到这一点。

谢谢

2 个答案:

答案 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'}}