Quero obter uma lista dos cabeçalhos das colunas de um DataFrame do pandas. O DataFrame virá da entrada do usuário, portanto não saberei quantas colunas haverá ou como serão chamadas.
Por exemplo, se eu receber um DataFrame como este:
>>> my_dataframe
y gdp cap
0 1 2 5
1 2 3 9
2 8 7 2
3 3 4 7
4 6 7 7
5 4 8 3
6 8 2 8
7 9 9 10
8 6 6 4
9 10 10 7
Eu gostaria de obter uma lista como esta:
>>> header_list
['y', 'gdp', 'cap']
columns
como atributo?df.column_names()
. Essa resposta ainda está correta ou está desatualizada?Existe um método embutido que é o mais eficiente:
.columns
retorna um índice,.columns.values
retorna uma matriz e isso tem uma função auxiliar.tolist
para retornar uma lista.Se o desempenho não for tão importante para você, os
Index
objetos definem um.tolist()
método que você pode chamar diretamente:A diferença no desempenho é óbvia:
Para aqueles que odeiam a digitação, você pode apenas chamar
list
ondf
, assim:fonte
DataFrame
iterável não mudou desde o primeiro dia: pandas.pydata.org/pandas-docs/stable/basics.html#iteration . O iterável retornado de um DataFrame sempre foi as colunas; portanto, esse procedimentofor col in df:
deve sempre se comportar da mesma forma, a menos que os desenvolvedores tenham um colapso,list(df)
e ainda deve ser um método válido. Observe quedf.keys()
está chamando para a implementação interna da estrutura dict-like retornando as chaves que são as colunas. Downvotes inexplicáveis é o efeito colateral de se esperar no SO então não se preocupecolumns
atributo. Há uma hora, li sobre a Lei de Demeter promovendo que o chamador não deveria depender da navegação no modelo de objeto interno.list(df)
faz conversão de tipo explícita. Efeito colateral notável: o tempo de execução e o consumo de memória aumentam com odf.keys()
método de tamanho do quadro de dados faz parte da natureza ditada de aDataFrame
. Fato notável: o tempo de execuçãodf.keys()
é bastante constante, independentemente do tamanho do quadro de dados - parte da responsabilidade dos desenvolvedores do pandas.Fiz alguns testes rápidos e, talvez sem surpresa, a versão incorporada
dataframe.columns.values.tolist()
é a mais rápida:(Eu ainda gosto muito do
list(dataframe)
mesmo, então, obrigado EdChum!)fonte
Torna-se ainda mais simples (pelos pandas 0.16.0):
fornecerá os nomes das colunas em uma boa lista.
fonte
Para listar as colunas de um quadro de dados no modo depurador, use uma compreensão da lista:
A propósito, você pode obter uma lista classificada simplesmente usando
sorted
:fonte
list(df)
funcionaria apenas com quadros de dados de incremento automático? Ou funciona para todos os quadros de dados?[c for c in df]
.Surpreso por não ter visto isso publicado até agora, então vou deixar isso aqui.
Descompactação Iterável Estendida (python3.5 +):
[*df]
e AmigosGeneralizações de desempacotamento (PEP 448) foram introduzidas com o Python 3.5. Portanto, as seguintes operações são possíveis.
Se você quer um
list
....Ou, se você quiser um
set
,Ou, se você quiser um
tuple
,Ou, se você deseja armazenar o resultado em algum lugar,
... se você é o tipo de pessoa que converte café em sons de digitação, bem, isso consumirá seu café com mais eficiência;)
Verificação visual
Como eu já vi isso discutido em outras respostas, você pode utilizar a descompactação iterável (sem necessidade de loops explícitos).
Crítica de outros métodos
Não use um
for
loop explícito para uma operação que possa ser feita em uma única linha (a compreensão da lista está correta).Em seguida, o uso
sorted(df)
não preserva a ordem original das colunas. Para isso, você deve usar em seulist(df)
lugar.A seguir,
list(df.columns)
elist(df.columns.values)
há sugestões ruins (na versão atual, v0.24). As matrizesIndex
(retornadas dedf.columns
) e NumPy (retornadas pordf.columns.values
) definem o.tolist()
método que é mais rápido e mais idiomático.Por fim, a listagem, por exemplo,
list(df)
deve ser usada apenas como uma alternativa concisa aos métodos acima mencionados para python <= 3.4, onde a descompactação estendida não está disponível.fonte
Está disponível como
my_dataframe.columns
.fonte
header_list = list(my_dataframe.columns)
df.columns.tolist()
.É interessante, mas
df.columns.values.tolist()
é quase três vezes mais rápido,df.columns.tolist()
mas eu pensei que eles são os mesmos:fonte
.values
retorna a matriz numpy subjacente e fazer algo com numpy quase sempre é mais rápido do que fazer a mesma coisa diretamente com os pandas.Um DataFrame segue a convenção do tipo ditado de iterar sobre as "chaves" dos objetos.
Crie uma lista de chaves / colunas - método de objeto
to_list()
e maneira pitônicaA iteração básica em um DataFrame retorna rótulos de coluna
Não converta um DataFrame em uma lista, apenas para obter os rótulos da coluna. Não pare de pensar enquanto procura exemplos de código convenientes.
fonte
df.columns
é muito mais rápido quedf.keys()
. Não sei por que eles têm uma função e um atributo para a mesma coisa (bem, não é a primeira vez que vejo 10 maneiras diferentes de fazer algo em pandas).No caderno
Para exploração de dados no notebook IPython, minha maneira preferida é a seguinte:
O que produzirá uma lista ordenada alfabeticamente de fácil leitura.
Em um repositório de código
No código, acho mais explícito fazer
Porque diz aos outros que leem seu código o que você está fazendo.
fonte
sorted(df)
muda a ordem. Use com cuidado.fonte
respondido por Simeon Visser ... você poderia fazer
ou
Mas acho que mais o ponto ideal é:
É explícito, ao mesmo tempo não desnecessariamente longo.
fonte
list
não tem mérito, a menos que você a esteja chamandodf
diretamente (por exemplo, concisão). O acesso ao.columns
atributo retorna umIndex
objeto que possui umtolist()
método definido e a chamada é mais idiomática do que listar oIndex
. Misturar expressões idiomáticas apenas por uma questão de completude não é uma ótima idéia. O mesmo vale para listar a matriz que você obtém.values
.Para uma verificação rápida, clara e visual, tente o seguinte:
fonte
Isso nos dá os nomes das colunas em uma lista:
Outra função chamada tolist () também pode ser usada:
fonte
Sinto que a pergunta merece uma explicação adicional.
Como o @fixxxer observou, a resposta depende da versão do pandas que você está usando no seu projeto. Que você pode obter com o
pd.__version__
comando.Se você, por algum motivo como eu (no debian jessie, uso 0.14.1) usando a versão mais antiga do pandas que a 0.16.0, então você precisa usar:
df.keys().tolist()
porque ainda não existe umdf.columns
método implementado.A vantagem desse método de chaves é que ele funciona mesmo na versão mais recente do pandas, por isso é mais universal.
fonte
fonte
[n for n in dataframe.columns]
Mesmo que a solução fornecida acima seja boa. Eu também esperaria que algo como frame.column_names () fosse uma função no pandas, mas como não é, talvez seja bom usar a seguinte sintaxe. De alguma forma, preserva a sensação de que você está usando pandas de maneira adequada, chamando a função "tolist": frame.columns.tolist ()
fonte
Se o DataFrame tiver um índice ou um MultiIndex e você desejar incluí-los também como nomes de colunas:
Evita chamar reset_index () que possui um desempenho desnecessário para uma operação tão simples.
Passei a precisar disso com mais frequência porque estou transferindo dados de bancos de dados nos quais o índice do quadro de dados é mapeado para uma chave primária / única, mas na verdade é apenas mais uma "coluna" para mim. Provavelmente faria sentido que os pandas tivessem um método embutido para algo assim (totalmente possível que eu tenha perdido).
fonte
Esta solução lista todas as colunas do seu objeto my_dataframe:
fonte