Eu tenho dados em colunas diferentes, mas não sei como extraí-los para salvá-los em outra variável.
index a b c
1 2 3 4
2 3 4 5
Como faço para selecionar 'a'
, 'b'
e guardá-lo para DF1?
eu tentei
df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']
Nenhum parece funcionar.
.ix
, pois é ambíguo. Use.iloc
ou.loc
se precisar.> csvtable_imp_1 <- csvtable_imp[0:6]
e seleciona a quantidade delta das primeiras colunas entre 0 e 6. Tudo o que eu precisava fazer era ler a tabela csv conforme delimitada pela readr lib.infile_1 = largefile_stay.ix[:,0:6]
ix
agora está obsoleto. O Pandas recomenda o uso de:loc
(indexação baseada em rótulo) ouiloc
(indexação baseada em posição).Respostas:
Os nomes das colunas (que são cadeias) não podem ser divididos da maneira que você tentou.
Aqui você tem algumas opções. Se você souber do contexto quais variáveis deseja separar, basta retornar uma exibição apenas dessas colunas, passando uma lista para a
__getitem__
sintaxe (os [] ').Como alternativa, se for importante indexá-los numericamente e não pelo nome (digamos que seu código faça isso automaticamente sem conhecer os nomes das duas primeiras colunas), você poderá fazer isso:
Além disso, você deve se familiarizar com a idéia de uma exibição em um objeto Pandas versus uma cópia desse objeto. O primeiro dos métodos acima retornará uma nova cópia na memória do subobjeto desejado (as fatias desejadas).
Às vezes, no entanto, existem convenções de indexação no Pandas que não fazem isso e fornecem uma nova variável que se refere apenas ao mesmo pedaço de memória que o subobjeto ou fatia no objeto original. Isso acontecerá com a segunda maneira de indexação, para que você possa modificá-lo com a
copy()
função para obter uma cópia regular. Quando isso acontece, alterar o que você acha que é o objeto fatiado pode às vezes alterar o objeto original. É sempre bom estar atento a isso.Para usar
iloc
, você precisa conhecer as posições da coluna (ou índices). Como as posições da coluna podem mudar, em vez de índices codificados, você pode usariloc
junto com aget_loc
função docolumns
método do objeto dataframe para obter índices da coluna.Agora você pode usar este dicionário para acessar colunas através de nomes e usando
iloc
.fonte
df[['a','b']]
produz uma cópiaix[]
se você preferir usarix[]
por qualquer motivo.ix
indexa linhas, não colunas. Eu pensei que o OP queria colunas.ix
aceita argumentos de fatia, para que você também possa obter colunas. Por exemplo,df.ix[0:2, 0:2]
obtém o sub-array 2x2 superior esquerdo da mesma forma que para uma matriz NumPy (dependendo dos nomes das colunas, é claro). Você pode até usar a sintaxe da fatia nos nomes de string das colunas, comodf.ix[0, 'Col1':'Col5']
. Isso obtém todas as colunas que são ordenadas entreCol1
eCol5
nadf.columns
matriz. É incorreto dizer queix
indexa linhas. Esse é apenas o seu uso mais básico. Ele também suporta muito mais indexação do que isso. Então,ix
é perfeitamente geral para esta pergunta..iloc
exclusivo da última posição, assim como as listas Python.Na versão 0.11.0, as colunas podem ser divididas da maneira que você tentou usar o
.loc
indexador:é equivalente a
e colunas de volta
C
atravésE
.Uma demonstração em um DataFrame gerado aleatoriamente:
Para obter as colunas de C a E (observe que, diferentemente da fatia inteira, 'E' está incluído nas colunas):
O mesmo funciona para selecionar linhas com base em rótulos. Obtenha as linhas 'R6' para 'R10' dessas colunas:
.loc
também aceita uma matriz booleana para que você possa selecionar as colunas cuja entrada correspondente na matriz éTrue
. Por exemplo,df.columns.isin(list('BCD'))
retornaarray([False, True, True, True, False, False], dtype=bool)
- True se o nome da coluna estiver na lista['B', 'C', 'D']
; Falso, caso contrário.fonte
Supondo que os nomes das colunas (
df.columns
) sejam['index','a','b','c']
, os dados que você deseja estão nas 3ª e 4ª colunas. Se você não souber o nome deles quando o script for executado, poderá fazer issoComo o EMS aponta em sua resposta ,
df.ix
corta as colunas de maneira um pouco mais concisa, mas a.columns
interface de fatiamento pode ser mais natural porque usa a sintaxe de indexação / faturamento de lista python 1-D de baunilha.AVISO:
'index'
é um nome ruim para umaDataFrame
coluna. Esse mesmo rótulo também é usado para odf.index
atributo real , umaIndex
matriz. Portanto, sua coluna é retornada pordf['index']
e o índice DataFrame real é retornado pordf.index
. AnIndex
é um tipo especial deSeries
otimizado para a pesquisa dos valores de seus elementos. Para df.index, é procurar linhas pelo rótulo. Essedf.columns
atributo também é umapd.Index
matriz, para procurar colunas por seus rótulos.fonte
.ix
é apenas para linhas. É para fatias de uso geral e pode ser usado para fatias multidimensionais. É basicamente apenas uma interface para a sintaxe usual do NumPy . Dito isto, você pode facilmente converter um problema de divisão de colunas em um problema de divisão de linhas apenas aplicando uma operação de transposição . Seu exemplo usa , o que é um pouco enganador. O resultado de é a ; tenha cuidado para não tratá-lo apenas como uma matriz. Além disso, você provavelmente deve alterá-lo para corresponder ao seu comentário "3º e 4º".__getitem__
df.T
columns[1:3]
columns
Series
columns[2:3]
[2:4]
está correto. Você[2:3]
está errado. E usar a notação padrão de fatia de python para gerar uma sequência / série não é um IMO enganoso. Mas eu gosto do seu desvio da interface do DataFrame para acessar a matriz numpy subjacenteix
.df.columns
e desejar dividi-lo por rótulo , terá uma semântica de fatia diferente do que se você o dividisse pela posição do índice inteiro . Definitivamente, não o expliquei bem no meu comentário anterior.columns
é uma série imutável e o getter foi substituído para usar rótulos como índices. Obrigado por reservar um tempo para esclarecer.fonte
df[['b as foo', 'c as bar']
tal que a saída renomeie a colunab
comofoo
e a colunac
comobar
?df[['b', 'c']].rename(columns = {'b' : 'foo', 'c' : 'bar'})
Sei que essa pergunta é bastante antiga, mas na versão mais recente do pandas existe uma maneira fácil de fazer exatamente isso. Os nomes das colunas (que são cadeias) podem ser divididos da maneira que você desejar.
fonte
Você pode fornecer uma lista de colunas a serem descartadas e retornar o DataFrame apenas com as colunas necessárias, usando a
drop()
função em um DataFrame do Pandas.Apenas dizendo
retornaria um DataFrame com apenas as colunas
b
ec
.O
drop
método está documentado aqui .fonte
Com pandas,
com nomes de colunas
para selecionar por iloc e colunas específicas com número de índice:
com nomes de colunas loc pode ser usado como
fonte
Eu achei esse método muito útil:
Mais detalhes podem ser encontrados aqui
fonte
surveys_df.iloc [:, [2,5]]
então.A partir de 0.21.0, o uso
.loc
ou[]
uma lista com um ou mais rótulos ausentes é preterido em favor de.reindex
. Portanto, a resposta para sua pergunta é:df1 = df.reindex(columns=['b','c'])
Nas versões anteriores, o uso
.loc[list-of-labels]
funcionaria contanto que pelo menos 1 das chaves fosse encontrada (caso contrário, aumentaria aKeyError
). Esse comportamento foi descontinuado e agora mostra uma mensagem de aviso. A alternativa recomendada é usar.reindex()
.Leia mais em Indexação e seleção de dados
fonte
Você pode usar pandas. Eu crio o DataFrame:
O DataFrame:
Para selecionar uma ou mais colunas por nome:
Você também pode usar:
E você recebe coluna
Test_2
Você também pode selecionar colunas e linhas dessas linhas usando
.loc()
. Isso é chamado de "fatiar" . Observe que eu passo da colunaTest_1
paraTest_3
A "fatia" é:
E se você quiser
Peter
eAnn
de colunasTest_1
eTest_3
:Você obtém:
fonte
Se você deseja obter um elemento pelo índice de linha e nome da coluna, pode fazê-lo exatamente como
df['b'][0]
. É tão simples quanto você pode imaginar.Ou você pode usar o
df.ix[0,'b']
uso misto de índice e rótulo.Nota: Desde que a v0.20
ix
foi descontinuada em favor deloc
/iloc
.fonte
Uma abordagem diferente e fácil: iterar linhas
usando iterows
fonte
As diferentes abordagens discutidas nas respostas acima são baseadas no pressuposto de que o usuário sabe que os índices das colunas devem ser excluídos ou subconjuntos ou que deseja subconjunto de um quadro de dados usando um intervalo de colunas (por exemplo, entre 'C': 'E') . pandas.DataFrame.drop () é certamente uma opção para subconjunto de dados com base em uma lista de colunas definidas pelo usuário (embora você precise ser cauteloso ao usar sempre a cópia do dataframe e os parâmetros do local não devem ser configurados como True !!)
Outra opção é usar pandas.columns.difference () , que faz uma diferença definida nos nomes das colunas e retorna um tipo de índice de matriz que contém as colunas desejadas. A seguir está a solução:
A saída seria:
b c 1 3 4 2 4 5
fonte
df1 = df[df.columns.difference(columns_for_differencing)]
retornará um quadro de dados novo / copiado. Você poderá modificardf1
sem alterardf
. Obrigado, aliás. Era exatamente disso que eu precisava.você também pode usar df.pop ()
deixe-me saber se isso ajuda para você, use df.pop (c)
fonte
Eu já vi várias respostas sobre isso, mas permaneceu incerto para mim. Como você selecionaria essas colunas de interesse? A resposta para isso é que, se você os tiver reunido em uma lista, poderá fazer referência às colunas usando a lista.
Exemplo
Eu tenho a seguinte lista / matriz numpy
extracted_features
, especificando 63 colunas. O conjunto de dados original tem 103 colunas e eu gostaria de extrair exatamente essas, então eu usariaE você vai acabar com isso
Isso é algo que você usaria com frequência no Machine Learning (mais especificamente, na seleção de recursos). Eu gostaria de discutir outras maneiras também, mas acho que isso já foi coberto por outros stackoverflowers. Espero que isso tenha sido útil!
fonte
Você pode usar o
pandas.DataFrame.filter
método para filtrar ou reordenar colunas como esta:fonte
fonte