J'ai un DataFrame dynamique qui fonctionne bien, mais lorsqu'il n'y a pas de données à ajouter dans le DataFrame, j'obtiens une erreur. Et donc j'ai besoin d'une solution pour créer un DataFrame vide avec seulement les noms des colonnes.
Pour l'instant, j'ai quelque chose comme ceci :
df = pd.DataFrame(columns=COLUMN_NAMES) # Note that there are now row data inserted.
PS : Il est important que les noms des colonnes apparaissent toujours dans un DataFrame.
Mais lorsque je l'utilise comme cela, j'obtiens quelque chose comme ça comme résultat :
Index([], dtype='object')
Empty DataFrame
La partie "Empty DataFrame" ; est bonne ! Mais au lieu de l'index, j'ai besoin d'afficher les colonnes.
Modifier :
Une chose importante que j'ai découvert : Je suis en train de convertir ce DataFrame en PDF en utilisant Jinja2, et donc j'appelle une méthode pour d'abord le sortir en HTML comme ça :
df.to_html()
Je pense que c'est là que les colonnes se perdent.
Edit2 : En général, j'ai suivi cet exemple : http://pbpython.com/pdf-reports.html. La css provient également de ce lien. C'est ce que je fais pour envoyer le dataframe vers le 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 j'imprime le dataframe juste après sa création, j'obtiens le résultat suivant :
[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: []
Cela semble raisonnable, mais si j'imprime le fichier 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>'
Et il semble que les colonnes sont déjà manquantes.
E4 : Si j'imprime ce qui suit :
print(df.to_html())
J'obtiens déjà le résultat suivant :
<table border="1" class="dataframe">
<tbody>
<tr>
<td>Index([], dtype='object')</td>
<td>Empty DataFrame</td>
</tr>
</tbody>
</table>
Vous pouvez créer un DataFrame vide avec des noms de colonnes ou un index :
In [4]: import pandas as pd
In [5]: df = pd.DataFrame(columns=['A','B','C','D','E','F','G'])
In [6]: df
Out[6]:
Empty DataFrame
Columns: [A, B, C, D, E, F, G]
Index: []
Ou
In [7]: df = pd.DataFrame(index=range(1,10))
In [8]: df
Out[8]:
Empty DataFrame
Columns: []
Index: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Editer : Même après votre modification avec le .to_html, je ne peux pas reproduire. Ceci :
df = pd.DataFrame(columns=['A','B','C','D','E','F','G'])
df.to_html('test.html')
Produit :
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>A</th>
<th>B</th>
<th>C</th>
<th>D</th>
<th>E</th>
<th>F</th>
<th>G</th>
</tr>
</thead>
<tbody>
</tbody>
</table>