Tengo un DataFrame dinámico que funciona bien, pero cuando no hay datos para agregar al DataFrame, aparece un error. Y, por lo tanto, necesito una solución para crear un DataFrame vacío con solo los nombres de columna.
Por ahora tengo algo como esto:
df = pd.DataFrame(columns=COLUMN_NAMES) # Note that there are now row data inserted.
PD: es importante que los nombres de columna sigan apareciendo en un DataFrame.
Pero cuando lo uso así obtengo algo así como resultado:
Index([], dtype='object')
Empty DataFrame
¡La parte "Empty DataFrame" es buena! Pero en lugar de lo del índice, todavía necesito mostrar las columnas.
Editar:
Una cosa importante que descubrí: estoy convirtiendo este DataFrame a PDF usando Jinja2, por lo tanto, estoy llamando a un método para primero enviarlo a HTML de esta manera:
df.to_html()
Aquí es donde las columnas se pierden, creo.
Edit2: en general, seguí este ejemplo: http://pbpython.com/pdf-reports.html . El CSS también es del enlace. Eso es lo que hago para enviar el marco de datos al PDF:
env = Environment(loader=FileSystemLoader('.'))
template = env.get_template("pdf_report_template.html")
template_vars = {"my_dataframe": df.to_html()}
html_out = template.render(template_vars)
HTML(string=html_out).write_pdf("my_pdf.pdf", stylesheets=["pdf_report_style.css"])
Edit3:
Si imprimo el marco de datos justo después de la creación, obtengo lo siguiente:
[0 rows x 9 columns]
Empty DataFrame
Columns: [column_a, column_b, column_c, column_d,
column_e, column_f, column_g,
column_h, column_i]
Index: []
Eso parece razonable, pero si imprimo el template_vars:
'my_dataframe': '<table border="1" class="dataframe">\n <tbody>\n <tr>\n <td>Index([], dtype=\'object\')</td>\n <td>Empty DataFrame</td>\n </tr>\n </tbody>\n</table>'
Y parece que ya faltan las columnas.
E4: si imprimo lo siguiente:
print(df.to_html())
Ya obtengo el siguiente resultado:
<table border="1" class="dataframe">
<tbody>
<tr>
<td>Index([], dtype='object')</td>
<td>Empty DataFrame</td>
</tr>
</tbody>
</table>