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.
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'.
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?
with open('my_csv.csv','a')as f:
df.to_csv(f, header=False)
Se este era o seu csv, foo.csv:
,A,B,C0,1,2,31,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]: dfOut[2]:
A B C01231456In[3]: df +6Out[3]:
A B C07891101112In[4]:with open('foo.csv','a')as f:(df +6).to_csv(f, header=False)
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 osifnot 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):raiseException("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.")elifnot(df.columns == pd.read_csv(csvFilePath, nrows=1, sep=sep).columns).all():raiseException("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)
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)
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 contextmanagerimport pandas as pd@contextmanagerdef 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)`
Respostas:
Você pode especificar um modo de gravação python na
to_csv
função pandas . Para acrescentar, é 'a'.No seu caso:
O modo padrão é 'w'.
fonte
df.to_csv(output_path, mode='a', header=not os.path.exists(output_path))
Você pode anexar a um csv abrindo o arquivo no modo de acréscimo:
Se este era o seu csv,
foo.csv
:Se você ler isso e depois anexar, por exemplo
df + 6
:foo.csv
torna-se:fonte
fonte
mode='a'
como parâmetro parato_csv
(ou seja,df.to_csv(f, mode='a', header=f.tell()==0)
Uma pequena função auxiliar que eu uso com algumas proteções de verificação de cabeçalho para lidar com tudo:
fonte
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:
fonte
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.
fonte