web-dev-qa-db-fra.com

Pandas crée un DataFrame vide avec uniquement des noms de colonnes

J'ai un DataFrame dynamique qui fonctionne bien, mais quand il n'y a pas de données à ajouter dans le DataFrame, j'obtiens une erreur. Et par conséquent, j'ai besoin d'une solution pour créer un DataFrame vide avec uniquement les noms de colonnes.

Pour l'instant j'ai quelque chose comme ça:

df = pd.DataFrame(columns=COLUMN_NAMES) # Note that there are now row data inserted.

PS: Il est important que les noms de colonnes apparaissent toujours dans un DataFrame.

Mais quand je l'utilise comme ça, je reçois quelque chose comme ça:

Index([], dtype='object')
Empty DataFrame

La partie "Empty DataFrame" est bonne! Mais au lieu de l'index, je dois toujours afficher les colonnes.

Modifier:

Une chose importante que j'ai découverte: je convertis ce DataFrame en PDF à l'aide de Jinja2, donc j'appelle une méthode pour la première sortie en HTML, comme ceci:

df.to_html()

C’est là que les colonnes se perdent je pense.

Edit2: En général, j'ai suivi cet exemple: http://pbpython.com/pdf-reports.html . Le css est aussi du lien. C'est ce que je fais pour envoyer le dataframe au 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 cadre de données juste après la création, je reçois le message 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 les 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 manquent déjà.

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>
90
E. Muuli

Vous pouvez créer un DataFrame vide avec des noms de colonne 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]

Edit: Même après votre amendement avec le .to_html, je ne peux pas reproduire. Cette:

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>
124
Marcus V.

Cherchez-vous quelque chose comme ça?

    COLUMN_NAMES=['A','B','C','D','E','F','G']
    df = pd.DataFrame(columns=COLUMN_NAMES)
    df.columns

   Index(['A', 'B', 'C', 'D', 'E', 'F', 'G'], dtype='object')
6
Linda

df.to_html () a un paramètre de colonnes.

Il suffit de passer les colonnes dans la méthode to_html ().

df.to_html(columns=['A','B','C','D','E','F','G'])
1
Eric