代码之家  ›  专栏  ›  技术社区  ›  user27074

Python熊猫:基于图例数据框标记分类值

  •  2
  • user27074  · 技术社区  · 8 年前

    我有一个大数据集(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 回复  |  直到 8 年前
        1
  •  1
  •   Robbie    8 年前

    您可以使用从 df2型 . 这样地:

    首先,生成一些虚拟数据:

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

    如果要替换一组变量:

    colNames = list(df1.columns)
    colNames.remove('obs')
    for variable in colNames:
        varDict = dict(df2.loc[df2['var']==variable][['value','label']].values)
        df1[variable+'_name'] = df1[variable].apply(lambda x: varDict[x])
    

    对于一百万行,大约需要1秒的时间,因此速度应该合理。

        2
  •  1
  •   Vaishali    8 年前

    使用groupby从df2创建映射器字典

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

    现在,使用字典的外键作为列映射df1中的值,而内部字典是映射器

    for col in df1.columns:
        if col in d.keys():
            df1[col] = df1[col].map(d[col])
    

    你得到

        obs gender  job
    0   1   male    blue collar
    1   2   male    white collar
    2   3   female  white collar
    3   4   male    blue collar