Eu tenho o seguinte DataFrame
( df
):
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(10, 5))
Eu adiciono mais colunas por atribuição:
df['mean'] = df.mean(1)
Como posso mover a coluna mean
para a frente, ou seja, defini-la como primeira coluna, deixando a ordem das outras colunas intocada?
MultiIndex
.Respostas:
Uma maneira fácil seria reatribuir o quadro de dados com uma lista das colunas, reorganizadas conforme necessário.
Isto é o que você tem agora:
Reorganize
cols
da maneira que desejar. Foi assim que mudei o último elemento para a primeira posição:Em seguida, reordene o quadro de dados da seguinte maneira:
fonte
cols
élist
; permite até duplicatas (que serão descartadas quando usadas no quadro de dados). Você está pensando emIndex
objetos.Você também pode fazer algo assim:
Você pode obter a lista de colunas com:
A saída produzirá:
... que é fácil de reorganizar manualmente antes de colocá-lo na primeira função
fonte
df.columns.tolist()
df = df[['mean1', 0, 1, 2, 3]]
✓pd.read_csv()
. Como sua resposta pode ser usada para alterar a ordem das colunas?Basta atribuir os nomes das colunas na ordem em que você deseja:
Agora, a coluna 'mean' aparece na frente:
fonte
<df>.columns
como você reclamar inicialmenteE se:
http://pandas.pydata.org/pandas-docs/stable/dsintro.html#column-selection-addition-deletion
fonte
pandas
? algo parecidodf.move(0,df.mean)
?df_metadata.insert(0,'Db_name',"raw_data")
(Código não é relevante para esta discussão)*** ValueError: cannot insert mean, already exists
No seu caso,
fará exatamente o que você quiser.
No meu caso (forma geral):
fonte
copy=False
mas parece quereindex_axis
ainda cria uma cópia.Você precisa criar uma nova lista de suas colunas na ordem desejada e, em seguida, usar
df = df[cols]
para reorganizar as colunas nessa nova ordem.Você também pode usar uma abordagem mais geral. Neste exemplo, a última coluna (indicada por -1) é inserida como a primeira coluna.
Você também pode usar essa abordagem para reordenar as colunas na ordem desejada, se elas estiverem presentes no DataFrame.
fonte
Você pode experimentar as seguintes soluções:
Solução 1:
Solução 2:
Solução 3:
Solução 4:
Solução 5:
solução 6:
Comparação de tempo:
Solução 1:
Solução 2 :
Solução 3 :
Solução 4 :
Solução 5 :
Solução 6 :
fonte
df = df.iloc[:, [1, 2, 3, 0]]
A partir de agosto de 2018:
Se os nomes das colunas forem muito longos para digitar, você poderá especificar o novo pedido por meio de uma lista de números inteiros com as posições:
Dados:
Exemplo genérico:
E para o caso específico da pergunta do OP:
O principal problema dessa abordagem é que chamar o mesmo código várias vezes criará resultados diferentes a cada vez, portanto, é preciso ter cuidado :)
fonte
Essa função evita que você precise listar todas as variáveis do seu conjunto de dados apenas para solicitar algumas delas.
São necessários dois argumentos, o primeiro é o conjunto de dados, o segundo são as colunas no conjunto de dados que você deseja trazer para a frente.
Portanto, no meu caso, tenho um conjunto de dados chamado Frame com as variáveis A1, A2, B1, B2, Total e Data. Se eu quero trazer o Total para a frente, tudo o que preciso fazer é:
Se eu quero trazer Total e Data para a frente, então eu faço:
EDITAR:
Outra maneira útil de usar isso é que, se você tiver uma tabela desconhecida e estiver procurando variáveis com um termo específico, como VAR1, VAR2, ... poderá executar algo como:
fonte
Eu mesmo tive uma pergunta semelhante e só queria acrescentar o que decidi. Eu gostei do
reindex_axis() method
para alterar a ordem das colunas. Isso funcionou:Um método alternativo baseado no comentário de @Jorge:
Embora
reindex_axis
pareça ser um pouco mais rápido em micro benchmarks quereindex
, acho que prefiro o último por sua franqueza.fonte
Simplesmente faça,
fonte
order = df.columns.tolist()
df['mean'] = df.mean(1)
df.columns = ['mean'] + order
headers
, que foi usada para criar um ditado que foi usado para criar o DataFrame, ligueidf.reindex(columns=headers)
. O único problema que encontrei foi que eu já havia telefonadodf.set_index('some header name', inplace=True)
; portanto, quando a reindexação foi concluída, ela adicionou outra coluna denominada,some header name
já que a coluna original agora era o índice. Quanto a sintaxe acima especificado,['mean'] + df.columns
no interpretador python me dáIndex(u'meanAddress', u'meanCity', u'meanFirst Name'...
Você pode fazer o seguinte (tomando emprestado partes da resposta de Aman):
fonte
Basta digitar o nome da coluna que deseja alterar e definir o índice para o novo local.
Para o seu caso, seria assim:
fonte
Movendo qualquer coluna para qualquer posição:
fonte
Eu acho que essa é uma solução um pouco mais limpa:
Essa solução é um pouco semelhante à solução do @JoeHeffer, mas esse é um liner.
Aqui, removemos a coluna
"mean"
do quadro de dados e a anexamos ao índice0
com o mesmo nome da coluna.fonte
Aqui está uma maneira de mover uma coluna existente que modificará o quadro de dados existente.
fonte
Esta pergunta foi respondida antes, mas reindex_axis está obsoleta agora, então eu sugiro usar:
fonte
Que tal usar "T"?
fonte
@clocker: Sua solução foi muito útil para mim, pois eu queria trazer duas colunas na frente de um dataframe onde não sei exatamente os nomes de todas as colunas, porque elas são geradas a partir de uma declaração dinâmica antes. Portanto, se você estiver na mesma situação: Para trazer as colunas à frente que você conhece o nome e depois deixá-las seguir "todas as outras colunas", eu vim com a seguinte solução geral;
fonte
set()
:Uma abordagem simples é usada
set()
, especialmente quando você tem uma lista longa de colunas e não deseja manipulá-las manualmente:fonte
Gostei da resposta de Shoresh para usar a funcionalidade de conjunto para remover colunas quando você não conhece o local, no entanto, isso não funcionou para o meu objetivo, pois preciso manter a ordem da coluna original (que possui rótulos arbitrários).
Eu tenho isso para trabalho embora usando IndexedSet do pacote Bolton.
Também precisei adicionar novamente vários rótulos de coluna; portanto, para um caso mais geral, usei o seguinte código:
Espero que isso seja útil para quem procura neste tópico uma solução geral.
fonte
set
com esse objetivo com bastante frequência e nunca tive que lidar com pedidos.Você pode usar o
reindex
que pode ser usado para ambos os eixos:fonte
Aqui está uma função para fazer isso para qualquer número de colunas.
fonte
Método mais hacky do livro
fonte
Eu acho que essa função é mais direta. Você só precisa especificar um subconjunto de colunas no início ou no final ou em ambos:
fonte
Creio que a resposta de @ Aman é a melhor se você souber a localização da outra coluna.
Se você não souber a localização de
mean
, mas tiver apenas seu nome, não poderá recorrer diretamente acols = cols[-1:] + cols[:-1]
. A seguir, é a próxima melhor coisa que eu poderia fazer:fonte
Basta virar ajuda frequentemente.
Ou apenas embaralhe para dar uma olhada.
fonte
A maioria das respostas não generalizou o suficiente e o método pandas reindex_axis é um pouco tedioso, portanto, ofereço uma função simples para mover um número arbitrário de colunas para qualquer posição usando um dicionário no qual key = nome da coluna e value = position para a qual mover. Se o seu quadro de dados for grande, passe True para 'big_data' e a função retornará a lista de colunas ordenadas. E você pode usar essa lista para dividir seus dados.
fonte
Eu tenho um caso de uso muito específico para reordenar nomes de colunas em pandas. Às vezes, estou criando uma nova coluna em um quadro de dados que se baseia em uma coluna existente. Por padrão, os pandas inserem minha nova coluna no final, mas quero que a nova coluna seja inserida ao lado da coluna existente da qual ela derivou.
fonte
Uma solução bastante direta que funcionou para mim é usar .reindex no df.columns:
fonte