2013-05-10 20 views
8

Widzę, że Panda ma read_fwf, ale czy ma coś takiego jak DataFrame.to_fwf? Szukam wsparcia dla szerokości pola, precyzji numerycznej i justowania ciągu. Wygląda na to, że DataFrame.to_csv tego nie robi. numpy.savetxt robi, ale nie chciałbym zrobić:Pandy Pythona, zapisz DataFrame do pliku o stałej szerokości (to_fwf?)

numpy.savetxt('myfile.txt', mydataframe.to_records(), fmt='some format') 

To tylko wydaje się błędne. Twoje pomysły są doceniane.

+2

Spójrz na 'metody to_string' więc sprawdzić, czy można zrobić to, co chcesz. – zach

+0

To wygląda blisko. Wygląda na to, że musiałbym podać funkcję formatowania dla każdej kolumny, jeśli dowolne dwie kolumny float lub string mają różne formaty. Zrobiłoby to trochę, po prostu wygląda trochę nieporęcznie. Miałem nadzieję, że czegoś mi brakuje. Dzięki! – jkmacc

+1

pandy * df.to_csv * ma parametr * sep = "" *, który zmienia przecinek na cokolwiek innego w tym przypadku spację lub pusty ciąg znaków. To w połączeniu z formaterem metody powinno to zrobić. – Joop

Odpowiedz

2

Jestem pewien, że znalazłeś sposób obejścia tego problemu, ale dla każdego, kto jest ciekawy ... Jeśli napiszesz DF na liście, możesz zapisać go do pliku, podając "format jako string'.format (indeksy lista) np

df=df.fillna('') 
outF = 'output.txt'  
dbOut = open(temp, 'w') 
v = df.values.T.tolist()   
for i in range(0,dfRows):  
    dbOut.write((\ 
    '{:7.2f}{:>6.2f}{:>2.0f}{:>4.0f}{:>5.0f}{:6.2f}{:6.2f}{:6.2f}{:6.1f {:>15}{:>60}'\ 
    .format(v[0][i],v[1][i],v[2][i],v[3][i],v[4][i],v[5][i],v[6][i],v[7][i],v[8][i],\ 
    v[9][i],v[10][i]))) 
    dbOut.write("\n") 
dbOut.close 

Wystarczy upewnić się, aby dopasować się każdego indeksu z prawidłowym formacie :)

nadzieję, że pomoże!

5

aż ktoś implements to w pand, można użyć pakietu tabulate:

import pandas as pd 
from tabulate import tabulate 

def to_fwf(df, fname): 
    content = tabulate(df.values.tolist(), list(df.columns), tablefmt="plain") 
    open(fname, "w").write(content) 

pd.DataFrame.to_fwf = to_fwf 
+0

To działało elegancko dla mnie. Tak wiele problemów, które kolidują z ręcznym formatowaniem spacji. – DeusXMachina

5

Python, Pandas : write content of DataFrame into text File

Pytanie aboves odpowiedź pomogła mi. To nie jest najlepszy, ale aż to_fwf istnieje to załatwi dla mnie ...

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

lub

np.savetxt(r'c:\data\np.txt', df.values, fmt='%10.5f') 
+0

IMO jest to lepsze niż "tabulate", ponieważ numpy jest dołączone do pand, więc nie wymaga dodatkowej biblioteki – maxymoo

1

Dla formatu niestandardowego dla każdej kolumny można ustawić format dla całej linii. FMT param zapewnia formatowanie dla każdej linii

with open('output.dat') as ofile: 
    fmt = '%.0f %02.0f %4.1f %3.0f %4.0f %4.1f %4.0f %4.1f %4.0f' 
    np.savetxt(ofile, df.values, fmt=fmt) 
Powiązane problemy