代码之家  ›  专栏  ›  技术社区  ›  Eran Moshe

pandas-还原许多热编码(虚拟变量)

  •  1
  • Eran Moshe  · 技术社区  · 7 年前

    假设我有以下内容 pandas.DataFrame :

    df = pd.DataFrame({'id': [1, 2, 3], 'val': [5, 5, 10],
                       'trig_aaa': [1, 0, 1], 'trig_bbb': [0, 1, 1], 'trig_ccc': [0, 0, 1]})
    print(df)
    
       id  val  trig_aaa  trig_bbb  trig_ccc
    0   1    5         1         0         0
    1   2    5         0         1         0
    2   3   10         1         1         1
    

    我想把它转到下面的df:

       id  val             trig
    0   1    5            [aaa]
    1   2    5            [bbb]
    2   3   10  [aaa, bbb, ccc]
    

    pandas/python/numpy中是否有优雅的(希望是预建的功能)?

    编辑1:

    在查看了JPP的评论之后,对数据帧的更好处理如下:

       id  val trig
    0   1    5  aaa
    1   2    5  bbb
    2   3   10  aaa
    3   3   10  bbb
    4   3   10  ccc
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   jpp    7 年前

    你可以使用 pd.melt :

    # rename columns and melt dataframe
    df.columns = [i if '_' not in i else i.split('_')[1] for i in df]
    res = pd.melt(df, id_vars=['id', 'val'], var_name='trig')
    
    # filter for 1 values and sort
    res = res[res['value'].eq(1)].sort_values('id').iloc[:, :-1].reset_index(drop=True)
    
    print(res)
    
       id  val trig
    0   1    5  aaa
    1   2    5  bbb
    2   3   10  aaa
    3   3   10  bbb
    4   3   10  ccc