将一键编码的数据帧列转换为一列

时间:2020-07-31 17:51:01

标签: python pandas numpy dataframe

在熊猫数据帧中,一键编码的矢量以列的形式出现,即:

Rows   A  B  C  D  E

0      0  0  0  1  0
1      0  0  1  0  0
2      0  1  0  0  0
3      0  0  0  1  0
4      1  0  0  0  0
4      0  0  0  0  1

如何通过在python中使用标签编码将这些列转换为一个数据帧列?即:

Rows   A  

0      4 
1      3  
2      2 
3      4 
4      1  
5      5  

还需要建议一些行具有多个1,如何处理这些行,因为我们一次只能有一个类别。

4 个答案:

答案 0 :(得分:6)

尝试使用argmax

#df=df.set_index('Rows')

df['New']=df.values.argmax(1)+1
df
Out[231]: 
      A  B  C  D  E  New
Rows                    
0     0  0  0  1  0    4
1     0  0  1  0  0    3
2     0  1  0  0  0    2
3     0  0  0  1  0    4
4     1  0  0  0  0    1
4     0  0  0  0  1    5

答案 1 :(得分:5)

argmax是要走的路,使用idxmaxget_indexer添加了另一种路:

df['New'] = df.columns.get_indexer(df.idxmax(1))+1
#df.idxmax(1).map(df.columns.get_loc)+1
print(df)

Rows  A  B  C  D  E   New
                    
0     0  0  0  1  0    4
1     0  0  1  0  0    3
2     0  1  0  0  0    2
3     0  0  0  1  0    4
4     1  0  0  0  0    1
5     0  0  0  0  1    5

答案 2 :(得分:3)

还需要建议一些行具有多个1,如何 处理这些行,因为我们一次只能有一个类别。

在这种情况下,您dot的虚拟人的DataFrame具有2的所有幂的数组(基于列数)。这样可以确保任何唯一的假人组合(A,A + B,A + B + C,B + C等)都将具有唯一的类别标签。 (在底部添加了几行以说明唯一计数)

df['Category'] = df.dot(2**np.arange(df.shape[1]))

      A  B  C  D  E  Category
Rows                         
0     0  0  0  1  0         8
1     0  0  1  0  0         4
2     0  1  0  0  0         2
3     0  0  0  1  0         8
4     1  0  0  0  0         1
5     0  0  0  0  1        16
6     1  0  0  0  1        17
7     0  1  0  0  1        18
8     1  1  0  0  1        19

答案 3 :(得分:3)

在其他出色的解决方案之上的另一种可读解决方案,它适用于数据框中的 ANY 类型的变量:

public void AddPoint(Point3d point)
{
    points.Add(point);
    MinMax.Min.X = Points.Min(p => p.X);
    MinMax.Min.Y = Points.Min(p => p.Y);
    MinMax.Max.X = Points.Max(p => p.X);
    MinMax.Max.Y = Points.Max(p => p.Y);
}

输出:

df['variables'] = np.where(df.values)[1]+1