Pandas — запись фрейма данных в форматированных строках фиксированной ширины в файл

#python #python-3.x #pandas #numpy #dataframe

#python #python-3.x #pandas #numpy #фрейм данных

Вопрос:

Иметь огромный фрейм данных pandas (df), подобный этому:

         id          date      a      b      c
0     0023  201110132120    -30    -45      7
1     0023  201110132130    -30     11   9111
2     0023  201110132140    -24     44    345
3     0023  201110132150    -19    223     11
4     0023  201110132200    -23  -3456  -1250
  

Мне нужно записать этот фрейм данных в файл со специальной фиксированной шириной для каждого поля.
Для этого я использовал numpy, например.:

 np.savetxt('out.txt', df.values, fmt='% 4s % 12s % 5s % 5s % 6s')
  

Это работает нормально. В этом случае потерян только заголовок. Есть ли обходной путь?

Я также тестировал его с помощью функции pandas to_string:

 df.to_string()
  

Но это так медленно. Почему? Есть ли другие варианты?

Ответ №1:

Одним из вариантов является злоупотребление header option в savetxt :

 formats = '% 4s % 12s % 5s % 5s % 6s'

headers = [format(str(x),y.replace('% ','>')) 
              for x, y in zip(df.columns,formats.split())]

np.savetxt('out.txt', df.values, fmt=formats,
           header=' '.join(headers), comments='')
  

Ответ №2:

 header='{:>4s} {:>12s} {:>5s} {:>5s} {:>6s}'.format('id','date','a','b','d')
np.savetxt('out.txt', df.values, fmt='% 4s % 12s % 5s % 5s % 6s', header=header)