Python 将一列转换为特定数量的列

Python 将一列转换为特定数量的列,python,numpy,bigdata,Python,Numpy,Bigdata,我试图将一列值在范围(0,5)内的数据根据其值转换为6列。 例如,如果它的值为0,则这六列中的第一列变为1,另一列变为0,依此类推。然而,由于我的目标的形状是(1034892,1),它需要很多时间,甚至有时会崩溃。这段代码已经处理了500000个数据,但对于这一数量,它没有 有没有什么方法可以让这么多的数据成为可能 def convert_to_num_class(target): for i, value in enumerate(target): if i ==0:

我试图将一列值在
范围(0,5)
内的数据根据其值转换为6列。 例如,如果它的值为0,则这六列中的第一列变为1,另一列变为0,依此类推。然而,由于我的目标的形状是(1034892,1),它需要很多时间,甚至有时会崩溃。这段代码已经处理了500000个数据,但对于这一数量,它没有

有没有什么方法可以让这么多的数据成为可能

def convert_to_num_class(target):
    for i, value in enumerate(target):
        if i ==0:
            y_new =np.array( np.eye(6)[int(value[0])])
        else:
            y_new = np.vstack((y_new, np.eye(6)[int(value[0])]))
    return(y_new)

使用熊猫
获取假人

>>> target = np.random.randint(6, size=(10, 1))  # the original target is of shape (1034892, 1)
>>> target = target.flatten()
array([0, 1, 0, 0, 4, 3, 1, 5, 4, 5])

>>> pd.get_dummies(target).to_numpy()
array([[1, 0, 0, 0, 0],
       [0, 1, 0, 0, 0],
       [1, 0, 0, 0, 0],
       [1, 0, 0, 0, 0],
       [0, 0, 0, 1, 0],
       [0, 0, 1, 0, 0],
       [0, 1, 0, 0, 0],
       [0, 0, 0, 0, 1],
       [0, 0, 0, 1, 0],
       [0, 0, 0, 0, 1]])
如果您的目标没有包含所需范围内的所有值(如上例中,
target
没有值2),则缺少的值将缺少列。一种解决方法如下:

>>> target = pd.Categorical(target, categories=np.arange(6))

>>> pd.get_dummies(target).to_numpy()
array([[1, 0, 0, 0, 0, 0],
       [0, 1, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0],
       [0, 0, 0, 1, 0, 0],
       [0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1],
       [0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 1]])

即使对于大小为
(1034892,1)
目标,速度也非常快。

我还通过使用keras.utils.np\u utils的to_category解决了这一问题,这一数据量只需要一秒钟:

from keras.utils.np_utils import to_categorical
def convert_to_num_class(target):
target = target.astype(np.int)
return(to_categorical(target, len(np.unique(target))))

无需求助于
pandas
keras
,只需使用元组进行索引:

import numpy as np

categories = 6
N = 10
target = np.random.randint(categories, size=(N,1)) # this should be your data

y = np.zeros((N, categories), dtype=np.uint8)
mask = (np.arange(N), target.flatten())
y[mask] = 1
性能检查:

def one_hot(target, categories=None): 
    target = target.flatten() 
    N = target.size 
    if categories is None:
        categories = target.max() - target.min() + 1 
    y = np.zeros((N, categories), dtype=np.uint8) 
    mask = (np.arange(N), target) 
    y[mask] = 1 
    return y 

N = 1034892
cats = 6
r = np.random.randint(cats, size=(N))

%timeit one_hot(r)
# 9.63 ms ± 187 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

import pandas as pd
%timeit pd.get_dummies(r).to_numpy()
# 18.2 ms ± 183 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

听起来像是sklearn的自制版本。使用内置的有很多优化benefits@martineau是的,这是可能的。非常感谢!这是我使用它时遇到的一个错误。例外:数据必须是一维的。你知道吗?@pgol我已经更新了我的答案。您只需展平您的
目标
(假设它是一个numpy形状数组(1034892,1))。我这样做了,但它仍然需要大量时间来处理这些数据。在我的机器上,它基本上是即时的,具有1034892个值。