Python, Pandas: zapisz zawartość DataFrame do pliku tekstowego

84

Mam takie pandy DataFrame

        X    Y  Z    Value 
0      18   55  1      70   
1      18   55  2      67 
2      18   57  2      75     
3      18   58  1      35  
4      19   54  2      70   

Chcę zapisać te dane do pliku tekstowego, który wygląda następująco:

18 55 1 70   
18 55 2 67 
18 57 2 75     
18 58 1 35  
19 54 2 70 

Próbowałem czegoś takiego

f = open(writePath, 'a')
f.writelines(['\n', str(data['X']), ' ', str(data['Y']), ' ', str(data['Z']), ' ', str(data['Value'])])
f.close()

ale to nie działa. Jak to zrobić?

Sounak
źródło

Odpowiedzi:

140

Możesz po prostu użyć np.savetxti uzyskać dostęp do atrybutu np .values:

np.savetxt(r'c:\data\np.txt', df.values, fmt='%d')

plony:

18 55 1 70
18 55 2 67
18 57 2 75
18 58 1 35
19 54 2 70

lub to_csv:

df.to_csv(r'c:\data\pandas.txt', header=None, index=None, sep=' ', mode='a')

Uwaga, ponieważ np.savetxtmusiałbyś przekazać uchwyt pliku, który został utworzony w trybie dołączania.

EdChum
źródło
32

Możesz użyć pandas.DataFrame.to_csv () i ustawić zarówno indexi, headerjak False:

In [97]: print df.to_csv(sep=' ', index=False, header=False)
18 55 1 70
18 55 2 67
18 57 2 75
18 58 1 35
19 54 2 70

pandas.DataFrame.to_csv może pisać bezpośrednio do pliku, więcej informacji można znaleźć w dokumentach, do których linki znajdują się powyżej.

Anzel
źródło
spowoduje to wiele problemów, gdy ucieczka musi się wydarzyć, nie jest to rozwiązanie dla ogólnej sprawy Pand!
matanster,
13

Spóźniony na przyjęcie: spróbuj tego>

base_filename = 'Values.txt'
with open(os.path.join(WorkingFolder, base_filename),'w') as outfile:
    df.to_string(outfile)
#Neatly allocate all columns and rows to a .txt file
Rene Duchamp
źródło
2
To nie daje pliku tekstowego rozdzielanego tabulatorami, wydaje się, że wyprowadza plik rozdzielany spacjami. Podoba mi się elegancja tego kodu, czy istnieje sposób na rozdzielenie tabulatorów wyjściowych?
AHegde
10

Obecnie najlepszym sposobem na to jest użycie df.to_string():

with open(writePath, 'a') as f:
    f.write(
        df.to_string(header = False, index = False)
    )

Wyświetli następujące informacje

18 55 1 70   
18 55 2 67 
18 57 2 75     
18 58 1 35  
19 54 2 70 

Ta metoda pozwala również łatwo wybrać, które kolumny mają być drukowane z columnsatrybutem, pozwala zachować kolumnę, indeksować etykiety, jeśli chcesz, i ma inne atrybuty dotyczące odstępów itp.

johnDanger
źródło
1

@AHegde - Aby uzyskać dane wyjściowe rozdzielane tabulatorami, użyj separatora sep = '\ t'.

Dla df.to_csv:

df.to_csv(r'c:\data\pandas.txt', header=None, index=None, sep='\t', mode='a')

W przypadku np.savetxt:

np.savetxt(r'c:\data\np.txt', df.values, fmt='%d', delimiter='\t')
Manohar Rana
źródło
1

Sposób na pobranie danych programu Excel do pliku tekstowego w postaci rozdzielanej tabulatorami. Musisz użyć Pand, a także xlrd.

import pandas as pd
import xlrd
import os

Path="C:\downloads"
wb = pd.ExcelFile(Path+"\\input.xlsx", engine=None)
sheet2 = pd.read_excel(wb, sheet_name="Sheet1")
Excel_Filter=sheet2[sheet2['Name']=='Test']
Excel_Filter.to_excel("C:\downloads\\output.xlsx", index=None)
wb2=xlrd.open_workbook(Path+"\\output.xlsx")
df=wb2.sheet_by_name("Sheet1")
x=df.nrows
y=df.ncols

for i in range(0,x):
    for j in range(0,y):
        A=str(df.cell_value(i,j))
        f=open(Path+"\\emails.txt", "a")
        f.write(A+"\t")
        f.close()
    f=open(Path+"\\emails.txt", "a")
    f.write("\n")
    f.close()
os.remove(Path+"\\output.xlsx")
print(Excel_Filter)

Najpierw musimy wygenerować plik xlsx z przefiltrowanymi danymi, a następnie przekonwertować informacje na plik tekstowy.

W zależności od wymagań możemy użyć \ n \ t dla pętli i typu danych, które chcemy w pliku tekstowym.

Bharat Bhushan
źródło
0

Użyłem nieco zmodyfikowanej wersji:

with open(file_name, 'w', encoding = 'utf-8') as f:
    for rec_index, rec in df.iterrows():
        f.write(rec['<field>'] + '\n')

Musiałem zapisać zawartość pola ramki danych (które zostało rozdzielone) jako plik tekstowy.

Bhaskaran Mani
źródło