Eu tenho um quadro de dados pandas (X11) como este: Na verdade, eu tenho 99 colunas até dx99
dx1 dx2 dx3 dx4
0 25041 40391 5856 0
1 25041 40391 25081 5856
2 25041 40391 42822 0
3 25061 40391 0 0
4 25041 40391 0 5856
5 40391 25002 5856 3569
Eu quero criar colunas adicionais para valores de célula como 25041,40391,5856 etc. Portanto, haverá uma coluna 25041 com o valor 1 ou 0 se 25041 ocorrer nessa linha específica em qualquer coluna dxs. Estou usando esse código e funciona quando o número de linhas é menor.
mat = X11.as_matrix(columns=None)
values, counts = np.unique(mat.astype(str), return_counts=True)
for x in values:
X11[x] = X11.isin([x]).any(1).astype(int)
Estou obtendo resultado assim:
dx1 dx2 dx3 dx4 0 25002 25041 25061 25081 3569 40391 42822 5856
25041 40391 5856 0 0 0 1 0 0 0 1 0 1
25041 40391 25081 5856 0 0 1 0 1 0 1 0 1
25041 40391 42822 0 0 0 1 0 0 0 1 1 0
25061 40391 0 0 0 0 0 1 0 0 1 0 0
25041 40391 0 5856 0 0 1 0 0 0 1 0 1
40391 25002 5856 3569 0 1 0 0 0 1 1 0 1
Quando o número de linhas é de muitos milhares ou milhões, ele fica suspenso e leva uma eternidade e não estou obtendo nenhum resultado. Por favor, veja que os valores das células não são exclusivos da coluna, ao invés de repetir em várias colunas. Por exemplo, 40391 está ocorrendo no dx1 e no dx2 e assim por diante para 0 e 5856 etc. Alguma idéia de como melhorar a lógica mencionada acima?
fonte
Respostas:
Há uma solução muito mais pythonic em pandas ...
Isso leva menos de um segundo em 10 milhões de linhas no meu laptop:
Aqui estão os detalhes apresentados:
Dataframe pequeno e simples -
Método de binarização -
Dataframe com 10 milhões de linhas -
Binarização temporizada (também conhecida como codificação one-hot) em 10 milhões de quadros de dados de linha -
Espero que isto ajude!
fonte
Parece que você deseja criar uma variável fictícia a partir de uma coluna de quadro de dados do pandas. Felizmente, pandas tem um método especial para ele:
get_dummies()
. Aqui está um trecho de código que você pode adaptar para sua necessidade:Aqui está a saída de
data_transformed
:fonte