I panda creano DataFrame vuoto con solo nomi di colonna


151

Ho un DataFrame dinamico che funziona bene, ma quando non ci sono dati da aggiungere nel DataFrame ricevo un errore. E quindi ho bisogno di una soluzione per creare un DataFrame vuoto con solo i nomi delle colonne.

Per ora ho qualcosa del genere:

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

PS: è importante che i nomi delle colonne vengano comunque visualizzati in un DataFrame.

Ma quando lo uso in questo modo ottengo qualcosa del genere come risultato:

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

La parte "Empty DataFrame" è buona! Ma invece della cosa indice devo visualizzare ancora le colonne.

Modificare:

Una cosa importante che ho scoperto: sto convertendo questo DataFrame in un PDF usando Jinja2, quindi quindi sto chiamando un metodo per primo output in HTML in questo modo:

df.to_html()

Qui è dove le colonne si perdono, credo.

Edit2: In generale, ho seguito questo esempio: http://pbpython.com/pdf-reports.html . Il CSS è anche dal link. Questo è quello che faccio per inviare il frame di dati 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:

Se stampo il frame di dati subito dopo la creazione ottengo il seguente:

[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: []

Sembra ragionevole, ma se stampo 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>'

E sembra che le colonne siano già mancanti.

E4: se stampo quanto segue:

print(df.to_html())

Ottengo già il seguente risultato:

<table border="1" class="dataframe">
  <tbody>
    <tr>
      <td>Index([], dtype='object')</td>
      <td>Empty DataFrame</td>
    </tr>
  </tbody>
</table>

Il seguito ora funziona per te? In caso contrario, dovresti fornire ulteriori informazioni sul tuo ambiente, come la versione di Python, la versione di Pandas, ecc.
Marcus V.

Sto usando Python v3.4, Pandas v0.13.1
E. Muuli il

1
Ciao Eerik, non riesco a riprodurre quello che hai in E4. Se lo faccio, la stampa sembra proprio quella che ho qui sotto. Potresti aggiornare la tua versione di Panda? Perché il tuo è piuttosto vecchio (io sono a 0.20.1).
Marcus V.

1
Grazie, l'aggiornamento di Panda ha funzionato!
E. Muuli,

Risposte:


190

È possibile creare un DataFrame vuoto con i nomi delle colonne o un indice:

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: []

O

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]

Modifica: anche dopo la tua modifica con .to_html, non riesco a riprodurre. Questo:

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

produce:

<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>

Ho modificato la domanda principale se questo aiuta. E: modificato di nuovo.
E. Muuli,

9

Stai cercando qualcosa del genere?

    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')


Inoltre, non ho perso i nomi delle mie colonne quando ho provato. È in un formato di tabella html.
Linda,

3

df.to_html() ha un parametro di colonne.

Basta passare le colonne nel to_html()metodo.

df.to_html(columns=['A','B','C','D','E','F','G'])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.