Python Tabulate форматирует только один столбец с плавающей точкой

Я использую tabulate модуль для печати файла с фиксированной шириной, и у меня есть один столбец, который мне нужно отформатировать таким образом, что есть 19 знаков слева от десятичной дроби и 2 места справа от десятичной.

import pandas as pd

from tabulate import tabulate

df = pd.DataFrame.from_dict({'A':['x','y','z'],
'B':[1,1.1,11.21],'C':[34.2334,81.1,11]})

df
Out[4]: 
   A      B        C
0  x   1.00  34.2334
1  y   1.10  81.1000
2  z  11.21  11.0000

df['C'] = df['C'].apply(lambda x: format(x,'0>22.2f'))

df
Out[6]: 
   A      B                       C
0  x   1.00  0000000000000000034.23
1  y   1.10  0000000000000000081.10
2  z  11.21  0000000000000000011.00

print(tabulate(df))
-  -  -----  -----
0  x   1     34.23
1  y   1.1   81.1
2  z  11.21  11
-  -  -----  -----

Можно ли как-нибудь сохранить форматирование в столбце C, не влияя на форматирование в столбце B? Я знаю, что могу использовать floatfmt = '0>22.2f', но мне не нужен столбец B, чтобы выглядеть таким образом, только столбец C.

Согласно табличной документации строки, которые выглядят как десятичные, будут автоматически преобразованы в числовые. Если бы я мог подавить это, отформатируйте мою таблицу перед печатью (как в примере выше), что решило бы это и для меня.

1 ответ

Решение

Вам абсолютно необходимо табулировать для этого? Вы можете добиться аналогичного эффекта (штриховые штрихи) с:

In [18]: print(df.__repr__().split('\n',1)[1])                                                                                                
0  x   1.00  0000000000000000034.23
1  y   1.10  0000000000000000081.10
2  z  11.21  0000000000000000011.00

df.__repr__ это представление dfто есть то, что вы видите, когда просто набираете df в клетке. Затем я удаляю строку заголовка, разбивая символ первой строки на новую и беря вторую половину разбиения.

Кроме того, если вы записываете его в машиночитаемую форму, вы можете использовать вкладки:

In [8]: df.to_csv(sys.stdout, sep='\t', header=False)                                                                                         
0   x   1.0 0000000000000000034.23
1   y   1.1 0000000000000000081.10
2   z   11.21   0000000000000000011.00

Это будет отображаться довольно сильно в зависимости от настроек отображения вкладок, но если вы выводите в файл, то вы получите символы вкладки

Документации на GitHub более уточненный и в нем говорится, что сfloatfmt"в каждом столбце может быть разное числовое форматирование". Вот пример использования ваших данных:

import pandas as pd
from tabulate import tabulate

df = pd.DataFrame.from_dict({'A':['x','yy','zzz'],
'B':[1,1.1,11.21],'C':[34.2334,81.1,11]})

print(tabulate(df, floatfmt=(None, None, '.2f', '0>22.2f',)))

Результат:

-  ---  -----  ----------------------
0  x     1.00  0000000000000000034.23
1  yy    1.10  0000000000000000081.10
2  zzz  11.21  0000000000000000011.00
-  ---  -----  ----------------------

Кроме того, как вы предложили, у вас также есть возможность disable_numparseкоторый отключает автоматическое преобразование строки в число. Затем вы можете отформатировать каждое поле вручную, но для этого потребуется больше кода. Опцияcolalign может пригодиться в таком случае, чтобы вы могли указать различное выравнивание столбцов для строк и чисел (которые вы также преобразовали бы в форматированные строки).

Другие вопросы по тегам