从虚拟特征中提取分类数据

时间:2018-11-21 18:51:51

标签: python-3.x pandas

我正在尝试将4个分类列合并为1个,大熊猫融化,但它会为每行创建3个重复项(使我多出4倍的行)。

dat = pd.DataFrame({'Name':('Tom','Pete','Mark','Steve'),
                    'Type1':(0,1,0,0),
                   'Type2':(1,0,0,0),
                   'Type3':(0,0,0,0),
                   'Type4':(0,0,0,0)})
dat = pd.melt(dat, id_vars='Name', 
              value_vars=('Type1', 'Type2', 'Type3', 'Type4'), value_name='type')



Name    variable    type
0   Tom     Type1   0
1   Pete    Type1   1
2   Mark    Type1   0
3   Steve   Type1   0
4   Tom     Type2   1
5   Pete    Type2   0
6   Mark    Type2   0
7   Steve   Type2   0
8   Tom     Type3   0
9   Pete    Type3   0
10  Mark    Type3   0
11  Steve   Type3   0
12  Tom     Type4   0
13  Pete    Type4   0
14  Mark    Type4   0
15  Steve   Type4   0

我遇到的另一个问题,我想不能通过melt解决,所有问题都是用'None'替换所有Types值为0的行-但这可以通过简单的查询完成-修复我现在担心重复。除非我不应该使用融化?

我想要得到的是:具有Type1或2或3或4的列。所以在这种情况下:

    Name    Type
0   Tom     Type2
1   Pete    Type1
2   Mark    Type3
3   Steve   Type3

最后2个位置最好变成'None',因为这2个名字没有分配类型。 (希望我不会发疯,这对除了我以外的人来说都是有意义的。)

1 个答案:

答案 0 :(得分:1)

idxmax

dat = pd.DataFrame({'Name':('Tom','Pete','Mark','Steve'),
                'Type1':(0,1,0,0),
               'Type2':(1,0,0,0),
               'Type3':(0,0,0,0),
               'Type4':(0,0,0,0)})

df = dat.loc[:,'Type1':].replace(0, np.nan)
df.idxmax(axis=1).to_frame(name='Type').set_index(dat.Name)

         Type
Name        
Tom    Type2
Pete   Type1
Mark     NaN
Steve    NaN