Como adicionar dados do pandas a um arquivo CSV existente?

259

Quero saber se é possível usar a to_csv()função pandas para adicionar um quadro de dados a um arquivo CSV existente. O arquivo csv tem a mesma estrutura que os dados carregados.

Ayoub Ennassiri
fonte
6
Eu acho que o método sugerido por @tlingf é melhor apenas porque ele está usando a funcionalidade incorporada da biblioteca do pandas. Ele sugere definir o modo como "a". "A" significa APPEND 'df.to_csv (' my_csv.csv ', mode =' a ', header = False)'
Ayrat
1
A resposta do @KCzar considera os dois casos em que o arquivo CSV não está lá (por exemplo, adicione o cabeçalho da coluna) e quando o CSV já está lá (adicione apenas as linhas de dados sem cabeçalhos). De qualquer forma, ele usa o modo "anexar" e um separador personalizado, juntamente com verificações no número de colunas.
TPPZ 17/04/19

Respostas:

544

Você pode especificar um modo de gravação python na to_csvfunção pandas . Para acrescentar, é 'a'.

No seu caso:

df.to_csv('my_csv.csv', mode='a', header=False)

O modo padrão é 'w'.

tlingf
fonte
7
Obrigado pela resposta. Isso permitirá que eu acrescente um novo df em linhas. Mas você poderia me informar como posso acrescentar o novo df na coluna?
datanew
Consegui fazê-lo relendo o 'my_csv.csv', depois concatene o novo df e salve-o. Se você conhece algum método mais fácil, entre em contato. Eu aprecio!
datanew
2
Como escrever o cabeçalho do primeiro arquivo e o restante das linhas é automaticamente anexado a ele?
Etisha 10/02
4
@Etisha algo comodf.to_csv(output_path, mode='a', header=not os.path.exists(output_path))
Michele Tonutti
255

Você pode anexar a um csv abrindo o arquivo no modo de acréscimo:

with open('my_csv.csv', 'a') as f:
    df.to_csv(f, header=False)

Se este era o seu csv, foo.csv:

,A,B,C
0,1,2,3
1,4,5,6

Se você ler isso e depois anexar, por exemplo df + 6:

In [1]: df = pd.read_csv('foo.csv', index_col=0)

In [2]: df
Out[2]:
   A  B  C
0  1  2  3
1  4  5  6

In [3]: df + 6
Out[3]:
    A   B   C
0   7   8   9
1  10  11  12

In [4]: with open('foo.csv', 'a') as f:
             (df + 6).to_csv(f, header=False)

foo.csv torna-se:

,A,B,C
0,1,2,3
1,4,5,6
0,7,8,9
1,10,11,12
Andy Hayden
fonte
50
with open(filename, 'a') as f:
    df.to_csv(f, header=f.tell()==0)
  • Criar arquivo, a menos que exista, caso contrário, acrescente
  • Adicione cabeçalho se o arquivo estiver sendo criado, caso contrário, pule-o
DeveScie
fonte
2
Está faltando um mode='a'como parâmetro para to_csv(ou seja,df.to_csv(f, mode='a', header=f.tell()==0)
Gabriela Melo
2
@GabrielaMelo Isso foi passado na função open (nome do arquivo, 'a').
Piyush 4/03
21

Uma pequena função auxiliar que eu uso com algumas proteções de verificação de cabeçalho para lidar com tudo:

def appendDFToCSV_void(df, csvFilePath, sep=","):
    import os
    if not os.path.isfile(csvFilePath):
        df.to_csv(csvFilePath, mode='a', index=False, sep=sep)
    elif len(df.columns) != len(pd.read_csv(csvFilePath, nrows=1, sep=sep).columns):
        raise Exception("Columns do not match!! Dataframe has " + str(len(df.columns)) + " columns. CSV file has " + str(len(pd.read_csv(csvFilePath, nrows=1, sep=sep).columns)) + " columns.")
    elif not (df.columns == pd.read_csv(csvFilePath, nrows=1, sep=sep).columns).all():
        raise Exception("Columns and column order of dataframe and csv file do not match!!")
    else:
        df.to_csv(csvFilePath, mode='a', index=False, sep=sep, header=False)
KCzar
fonte
1
O que poderíamos fazer se a ordem da coluna não corresponder?
Jason Goal
@JasonGoal df = df.reindex (classificado (df.columns), eixo = 1); consulte stackoverflow.com/a/11067072/9095840 .
markemus 25/02
4

Inicialmente, iniciando com quadros de dados pyspark - obtive erros de conversão de tipo (ao converter para pandas df e depois anexando a csv), dados os tipos de esquema / coluna nos meus quadros de dados pyspark

Resolvido o problema forçando todas as colunas em cada df a serem do tipo string e anexando-o ao csv da seguinte maneira:

with open('testAppend.csv', 'a') as f:
    df2.toPandas().astype(str).to_csv(f, header=False)
Grant Shannon
fonte
3

Um pouco atrasado para a festa, mas você também pode usar um gerenciador de contexto, se estiver abrindo e fechando seu arquivo várias vezes, ou registrando dados, estatísticas, etc.

from contextlib import contextmanager
import pandas as pd
@contextmanager
def open_file(path, mode):
     file_to=open(path,mode)
     yield file_to
     file_to.close()


##later
saved_df=pd.DataFrame(data)
with open_file('yourcsv.csv','r') as infile:
      saved_df.to_csv('yourcsv.csv',mode='a',header=False)`
ai-shwarya
fonte