Removendo a coluna de índice nos pandas ao ler um csv

128

Eu tenho o seguinte código que importa um arquivo CSV. Existem 3 colunas e quero definir as duas primeiras para variáveis. Quando defino a segunda coluna para a variável "eficiência", a coluna de índice também é abordada. Como posso me livrar da coluna do índice?

df = pd.DataFrame.from_csv('Efficiency_Data.csv', header=0, parse_dates=False)
energy = df.index
efficiency = df.Efficiency
print efficiency

Eu tentei usar

del df['index']

depois que eu defino

energy = df.index

que encontrei em outro post, mas que resulta em "KeyError: 'index'"

Bogdan Janiszewski
fonte

Respostas:

70

DataFrames e Series sempre têm um índice. Embora seja exibido ao lado da (s) coluna (s), não é uma coluna, e é por isso del df['index']que não funcionou.

Se você deseja substituir o índice por números seqüenciais simples, use df.reset_index().

Para entender por que o índice existe e como é usado, consulte, por exemplo, 10 minutos para o Pandas .

Dan Allan
fonte
1
Obrigado! Decidi apenas importá-lo de uma maneira diferente, sem usar pandas. Eu tenho que executar alguma aritmética em cada uma das colunas e python não estava gostando de ter a coluna de índice anexada. O Pandas é certamente a maneira mais fácil de importar dados, mas nem sempre é o melhor que eu descobri.
Bogdan Janiszewski,
2
Você tentou usar o Pandas para fazer a aritmética?
Jamie bull
1
pode-se remover o nome do índice?
Quant
3
Sim, index.name = None.
Dan Allan
1
@BogdanJaniszewski, se você não usou pandas, por que aceitou isso como resposta?
multigoodverse
249

Ao ler para e do seu arquivo CSV, inclua o argumento index=False, por exemplo:

 df.to_csv(filename, index=False)

e ler do csv

df.read_csv(filename, index=False)  

Isso deve evitar o problema, para que você não precise corrigi-lo mais tarde.

Steve
fonte
8
Muito obrigado. É exatamente isso que a pergunta está procurando.
Blue Dot azul
1
"header = False" funciona para remover cabeçalhos da mesma maneira
J.Dahlgren 11/10
29
deveria ser index_col=False.
Vedda
1
Usando df.to_sql("table",cursor,if_exists="append",index=False)também corrige o erro sqlitesqlite3.OperationalError: table message has no column named index
Anna
1
@vedda parece ser index=Falsepara to_excel()e index_col=Falsecom read_csv()pandas 0.23.4. : - /
matt wilkie 11/11
70

df.reset_index(drop=True, inplace=True)

Subhojit Mukherjee
fonte
2
Esta é realmente a minha solução favorita, mas não é uma resposta muito elaborada. O manual lê isso sobre o argumento drop: "Não tente inserir índice nas colunas do quadro de dados. Isso redefine o índice para o índice inteiro padrão". pandas.pydata.org/pandas-docs/stable/generated/…
tommy.carstensen
@ tommy.carstensen Então, como você evitaria colocar os números inteiros no índice como uma substituição do índice anterior? Eu acho que é um mal-entendido do texto do seu link. A questão aqui é soltar o índice . E isso é alcançado aqui. Você obtém os números inteiros padrão, pois não há quadro de datas sem um índice, mas você eliminou o índice anterior. É por isso que essa resposta deve ser a resposta aceita, também porque usa a memória com eficiência inplace=True.
Lorenz
13

Você pode definir uma das colunas como um índice, caso seja um "id", por exemplo. Nesse caso, a coluna do índice será substituída por uma das colunas que você escolheu.

df.set_index('id', inplace=True)
Natheer Alabsi
fonte
3

Se o seu problema for igual ao meu, você só deseja redefinir os cabeçalhos da coluna de 0 para o tamanho da coluna. Faz

df = pd.DataFrame(df.values);

EDITAR:

Não é uma boa ideia se você tiver tipos de dados heterogêneos. Melhor apenas usar

df.columns = range(len(df.columns))
Bhanu Pratap Singh
fonte
2

você pode especificar qual coluna é um índice no seu arquivo csv usando o parâmetro index_col da função from_csv, se isso não resolver o problema, forneça um exemplo dos seus dados

yemu
fonte
2

Uma coisa que eu faço é df=df.reset_index() entãodf=df.drop(['index'],axis=1)

Lord Varis
fonte
Erro: "rótulos ['index'] não contidos no eixo"
Vasin Yuriy
@VasinYuriy df.reset_index().drop(columns=['yourfirstindex', 'yoursecondindex']), isso funciona assim : ele funciona com 'index' apenas no caso padrão em que o índice não tem um nome e depois se torna uma coluna chamada 'index' com df.reset_index().drop(columns=['index']). O parâmetro adicionado axis=1é o padrão. Este método não é recomendado, o @ SubhojitMukherjee reset_index(inplace=True)trabalha "no local" e, portanto, economiza memória.
Lorenz