python - tablas - Bonita impresión de un marco de datos de pandas
seleccionar columnas en pandas (3)
Acabo de encontrar una gran herramienta para esa necesidad, se llama tabulate .
Imprime datos tabulares y funciona con 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 |
+----+-----------+-------------+
Nota: Hay una solicitud de extracción abierta que permitirá incluir / excluir el índice.
¿Cómo puedo imprimir un marco de datos de pandas como una buena tabla basada en texto, como la siguiente?
+------------+---------+-------------+
| column_one | col_two | column_3 |
+------------+---------+-------------+
| 0 | 0.0001 | ABCD |
| 1 | 1e-005 | ABCD |
| 2 | 1e-006 | long string |
| 3 | 1e-007 | ABCD |
+------------+---------+-------------+
Actualización: Encontré una solución a esto, publicada como respuesta a continuación.
Puede usar la tabla de prettytable para representar la tabla como texto. El truco consiste en convertir el data_frame en un archivo csv en memoria y leerlo con facilidad. Aquí está el código:
from StringIO import StringIO
import prettytable
output = StringIO()
data_frame.to_csv(output)
output.seek(0)
pt = prettytable.from_csv(output)
print pt
Utilicé la respuesta de Ofer por un tiempo y me pareció excelente en la mayoría de los casos. Lamentablemente, debido a las incoherencias entre to_csv y prettytable ''de las pandas, tuve que usar la tablable de una manera diferente.
Un caso de falla es un marco de datos que contiene comas:
pd.DataFrame({''A'': [1, 2], ''B'': [''a,'', ''b'']})
La mesable plantea un error de la forma:
Error: Could not determine delimiter
La siguiente función maneja este caso:
def format_for_print(df):
table = PrettyTable([''''] + list(df.columns))
for row in df.itertuples():
table.add_row(row)
return str(table)
Si no le importa el índice, use:
def format_for_print2(df):
table = PrettyTable(list(df.columns))
for row in df.itertuples():
table.add_row(row[1:])
return str(table)