Les pandas créent des DataFrame vides avec uniquement des noms de colonnes

151

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 par conséquent, j'ai besoin d'une solution pour créer un DataFrame vide avec uniquement les noms de colonne.

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, j'obtiens quelque chose comme ça:

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

La partie "DataFrame vide" est bonne! Mais au lieu de l'index, j'ai besoin de toujours afficher les colonnes.

Éditer:

Une chose importante que j'ai découverte: je convertis ce DataFrame en PDF en utilisant Jinja2, donc j'appelle une méthode pour le sortir d'abord en HTML comme ça:

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 provient également 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 dataframe juste après sa création, j'obtiens le 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 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>
E. Muuli
la source
Est-ce que ce qui suit fonctionne maintenant pour vous? Sinon, vous devriez fournir plus d'informations sur votre environnement, telles que la version Python, la version Pandas, etc.
Marcus V.
J'utilise Python v3.4, Pandas v0.13.1
E. Muuli
1
Salut Eerik, je ne peux pas reproduire ce que vous avez dans E4. Si je fais cela, l'impression ressemble exactement à ce que j'ai ci-dessous. Pourriez-vous mettre à jour votre version de pandas? Parce que le vôtre est plutôt vieux (je suis à 0.20.1).
Marcus V.
1
Merci, la mise à jour de Pandas a fonctionné!
E. Muuli

Réponses:

190

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. Ce:

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>
Marcus V.
la source
J'ai édité la question principale si cela aide. E: édité à nouveau.
E. Muuli
9

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')
Linda
la source
De plus, je n'ai pas perdu les noms de mes colonnes lorsque j'ai essayé. Il est dans un format de tableau html.
Linda
3

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

Passez simplement les colonnes dans la to_html()méthode.

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