在熊猫数据帧中,一键编码的矢量以列的形式出现,即:
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,如何处理这些行,因为我们一次只能有一个类别。
答案 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
是要走的路,使用idxmax
和get_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