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
может пригодиться в таком случае, чтобы вы могли указать различное выравнивание столбцов для строк и чисел (которые вы также преобразовали бы в форматированные строки).