【问题标题】:Python pandas: labeling categorical values based on legend dataframePython pandas:基于图例数据框标记分类值
【发布时间】:2018-02-22 21:52:09
【问题描述】:

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

谢谢

【问题讨论】:

    标签: python pandas dataframe label


    【解决方案1】:

    您可以使用从 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】:

      使用 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
      

      【讨论】:

        猜你喜欢
        • 2014-03-28
        • 2021-09-29
        • 2016-11-13
        • 2021-04-14
        • 2019-06-05
        • 1970-01-01
        • 2019-11-17
        • 2020-07-29
        • 2023-02-16
        相关资源
        最近更新 更多