使用列及其值在pandas数据框架中创建新列

时间:2018-04-25 06:55:44

标签: python pandas

我有一个熊猫数据框

 df = pd.DataFrame({'id':[1,2,3,4],
                    'attr1':[1,1,0,0],
                    'attr2':[0,1,1,0],
                    'attr3':[1,1,1,0],
                    'attr4':[1,1,1,1]})

enter image description here

我想将其转换为

enter image description here

基本上创建一个新变量,如果其值为1

,则该变量将包含先前的数据帧列

1 个答案:

答案 0 :(得分:4)

使用:

df1 = df.filter(like='attr')
df = df.drop(df1.columns, axis=1)
df['var'] = df1.dot(df1.columns + ' ').str.rstrip()
print (df)
   id                      var
0   1        attr1 attr3 attr4
1   2  attr1 attr2 attr3 attr4
2   3        attr2 attr3 attr4
3   4                    attr4

<强>解释

  1. filter过滤列 - 仅列属性列
  2. drop
  3. 删除列
  4. 使用DataFrame.dot
  5. 列进行矩阵乘法
  6. 最后按rstrip
  7. 删除最后一个空格

    替代解决方案:

    cols = df.columns[df.columns.str.startswith('attr')]
    df = df.drop(cols, axis=1).assign(var=df[cols].dot(cols + ' ').str.rstrip())
    print (df)
       id                      var
    0   1        attr1 attr3 attr4
    1   2  attr1 attr2 attr3 attr4
    2   3        attr2 attr3 attr4
    3   4                    attr4
    

    要恢复使用str.get_dummies

    df1 = df.join(df.pop('var').str.get_dummies(' '))
    print (df1)
       id  attr1  attr2  attr3  attr4
    0   1      1      0      1      1
    1   2      1      1      1      1
    2   3      0      1      1      1
    3   4      0      0      0      1