Python, Pandas: DataFrame içeriğini metin dosyasına yazın


84

Bunun gibi pandalarım DataFrame var

        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   

Bu verileri şuna benzer bir metin dosyasına yazmak istiyorum:

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

Gibi bir şey denedim

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

ama işe yaramıyor. Bu nasıl yapılır?

Yanıtlar:


140

Sadece np.savetxtnp özelliğini kullanabilir ve bu niteliğe erişebilirsiniz .values:

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

verim:

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

veya to_csv:

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

İçin Not np.savetxtsizinle ekleme modu ile oluşturulmuş bir dosya tanıtıcısından geçmesi gerekirdi.


32

Sen kullanabilirsiniz pandas.DataFrame.to_csv () ve her iki ayar indexve headeriçin 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 doğrudan bir dosyaya yazabilir, daha fazla bilgi için yukarıda bağlantısı verilen dokümanlara bakabilirsiniz.


bu, kaçmanın gerçekleşmesi gerektiğinde çok fazla sorunla karşılaşacak, genel Pandalar davasının çözümü değil!
matanster

13

Partiye geç: Bunu deneyin>

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

2
Bu sekmeyle ayrılmış bir metin dosyası vermez, boşlukla sınırlandırılmış bir dosya çıktı olarak görünür. Bu kodun zarafetini beğendim, çıktı sekmesini sınırlandırmanın bir yolu var mı?
AHegde

10

Bunu yapmanın şu anki en iyi yolu df.to_string()şunları kullanmaktır :

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

Aşağıdakileri çıkaracak

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

Bu yöntem aynı zamanda columnsöznitelikle hangi sütunların yazdırılacağını kolayca seçmenize izin verir, sütunu, isterseniz dizin etiketlerini tutmanıza izin verir ve boşluk vb. İçin başka özniteliklere sahiptir.


1

@AHegde - Sekmeyle ayrılmış çıktıyı almak için ayırıcı sep = '\ t' kullanın.

Df.to_csv için:

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

Np.savetxt için:

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

1

Excel verilerini sekmeyle ayrılmış biçimde metin dosyasına almanın yolu. Pandaların yanı sıra xlrd kullanmanız gerekir.

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)

Öncelikle xlsx dosyasını filtrelenmiş verilerle oluşturmalı ve ardından bilgileri bir metin dosyasına dönüştürmeliyiz.

Gereksinimlere bağlı olarak, metin dosyasında olmasını istediğimiz veri türleri ve döngüler için \ n \ t kullanabiliriz.


0

Biraz değiştirilmiş bir versiyon kullandım:

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

Bir veri çerçevesi alanının (sınırlandırılmış) içeriğini bir metin dosyası olarak yazmak zorunda kaldım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.