Pretty Printing a pandas dataframe
Как я могу напечатать фрейм данных Pandas в виде красивой текстовой таблицы, как показано ниже?
+------------+---------+-------------+
| column_one | col_two | column_3 |
+------------+---------+-------------+
| 0 | 0.0001 | ABCD |
| 1 | 1e-005 | ABCD |
| 2 | 1e-006 | long string |
| 3 | 1e-007 | ABCD |
+------------+---------+-------------+
Ответы
Ответ 1
Я только что нашел отличный инструмент для этой цели, он называется табулатурой.
Он печатает табличные данные и работает с DataFrame
.
from tabulate import tabulate
import pandas as pd
df = pd.DataFrame({'col_two' : [0.0001, 1e-005 , 1e-006, 1e-007],
'column_3' : ['ABCD', 'ABCD', 'long string', 'ABCD']})
print(tabulate(df, headers='keys', tablefmt='psql'))
+----+-----------+-------------+
| | col_two | column_3 |
|----+-----------+-------------|
| 0 | 0.0001 | ABCD |
| 1 | 1e-05 | ABCD |
| 2 | 1e-06 | long string |
| 3 | 1e-07 | ABCD |
+----+-----------+-------------+
Замечания:
Чтобы подавить индексы строк для всех типов данных, передайте showindex="never"
или showindex=False
.
Ответ 2
Вы можете использовать prettytable, чтобы отобразить таблицу как текст. Хитрость заключается в том, чтобы преобразовать data_frame в файл csv в памяти и иметь довольно табличные данные. Здесь код:
from StringIO import StringIO
import prettytable
output = StringIO()
data_frame.to_csv(output)
output.seek(0)
pt = prettytable.from_csv(output)
print pt
Ответ 3
Я использовал Ofer-ответ на некоторое время и нашел, что это здорово в большинстве случаев. К сожалению, из-за несоответствий между pandas to_csv и prettytable from_csv, мне пришлось использовать симпатичный вариант по-другому.
Один случай сбоя - это dataframe, содержащий запятые:
pd.DataFrame({'A': [1, 2], 'B': ['a,', 'b']})
Prettytable вызывает ошибку формы:
Error: Could not determine delimiter
Следующая функция обрабатывает этот случай:
def format_for_print(df):
table = PrettyTable([''] + list(df.columns))
for row in df.itertuples():
table.add_row(row)
return str(table)
Если вам не нужен индекс, используйте:
def format_for_print2(df):
table = PrettyTable(list(df.columns))
for row in df.itertuples():
table.add_row(row[1:])
return str(table)
Ответ 4
Простой подход заключается в выводе в виде html, что делает pandas из коробки:
df.to_html('temp.html')
Ответ 5
Если вы находитесь в блокноте Jupyter, вы можете запустить следующий код для интерактивного отображения кадра данных в хорошо отформатированной таблице.
Этот ответ основан на ответе to_html ('temp.html') выше, но вместо создания файла отображает хорошо отформатированную таблицу прямо в блокноте:
from IPython.display import display, HTML
display(HTML(df.to_html()))
Кредит для этого кода в примере: Показать DataFrame в виде таблицы в iPython Notebook
Ответ 6
Следуя ответу Марка, если вы по какой-то причине не используете Jupyter, например, хотите выполнить быстрое тестирование на консоли, вы можете использовать метод DataFrame.to_string
, который работает, как минимум, с Pandas 0.12 ( 2014) г.в.
import pandas as pd
matrix = [(1, 23, 45), (789, 1, 23), (45, 678, 90)]
df = pd.DataFrame(matrix, columns=list('abc'))
print(df.to_string())
# outputs:
# a b c
# 0 1 23 45
# 1 789 1 23
# 2 45 678 90
Ответ 7
Я хотел распечатать документ с данными, но я хотел добавить некоторые результаты и комментарии на той же странице. Я работал над вышеизложенным, и я не мог получить то, что я хотел. В итоге я использовал операторы file.write(df1.to_csv()) и file.write(",, blah ,,, blah"), чтобы получить свои дополнения на странице. Когда я открыл CSV файл, он сразу перешел к электронной таблице, которая печатала все в правильном темпе и формате.