Pandas erstellen einen leeren DataFrame mit nur Spaltennamen

151

Ich habe einen dynamischen DataFrame, der einwandfrei funktioniert, aber wenn dem DataFrame keine Daten hinzugefügt werden müssen, wird eine Fehlermeldung angezeigt. Und deshalb brauche ich eine Lösung, um einen leeren DataFrame nur mit den Spaltennamen zu erstellen.

Im Moment habe ich so etwas:

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

PS: Es ist wichtig, dass die Spaltennamen weiterhin in einem DataFrame angezeigt werden.

Aber wenn ich es so benutze, bekomme ich so etwas als Ergebnis:

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

Der Teil "Leerer DataFrame" ist gut! Aber anstelle der Index-Sache muss ich immer noch die Spalten anzeigen.

Bearbeiten:

Eine wichtige Sache, die ich herausgefunden habe: Ich konvertiere diesen DataFrame mit Jinja2 in ein PDF, daher rufe ich eine Methode auf, um ihn zuerst wie folgt in HTML auszugeben:

df.to_html()

Hier gehen die Spalten verloren, denke ich.

Edit2: Im Allgemeinen folgte ich diesem Beispiel: http://pbpython.com/pdf-reports.html . Das CSS ist auch vom Link. Das mache ich, um den Datenrahmen an das PDF zu senden:

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:

Wenn ich den Datenrahmen direkt nach der Erstellung ausdrucke, erhalte ich Folgendes:

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

Das scheint vernünftig, aber wenn ich die template_vars ausdrucke:

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

Und es scheint, dass die Spalten bereits fehlen.

E4: Wenn ich Folgendes ausdrucke:

print(df.to_html())

Ich bekomme schon folgendes Ergebnis:

<table border="1" class="dataframe">
  <tbody>
    <tr>
      <td>Index([], dtype='object')</td>
      <td>Empty DataFrame</td>
    </tr>
  </tbody>
</table>
E. Muuli
quelle
Funktioniert das Folgende jetzt für Sie? Wenn nicht, sollten Sie weitere Informationen zu Ihrer Umgebung bereitstellen, z. B. Python-Version, Pandas-Version usw.
Marcus V.
Ich benutze Python v3.4, Pandas v0.13.1
E. Muuli
1
Hallo Eerik, ich kann nicht reproduzieren, was du in E4 hast. Wenn ich das mache, sieht der Ausdruck genauso aus wie unten. Könnten Sie Ihre Pandas-Version aktualisieren? Weil deine ziemlich alt ist (ich bin bei 0,20,1).
Marcus V.
1
Danke, die Aktualisierung von Pandas hat funktioniert!
E. Muuli

Antworten:

190

Sie können einen leeren DataFrame mit Spaltennamen oder einem Index erstellen:

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

Oder

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]

Bearbeiten: Auch nach Ihrer Änderung mit der .to_html kann ich nicht reproduzieren. Dies:

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

Produziert:

<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.
quelle
Ich habe die Hauptfrage bearbeitet, wenn das hilft. E: Wieder bearbeitet.
E. Muuli
9

Suchen Sie so etwas?

    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
quelle
Außerdem verliere ich meine Spaltennamen nicht, wenn ich es versuche. Es ist in einem HTML-Tabellenformat.
Linda
3

df.to_html() hat einen Spaltenparameter.

Übergeben Sie einfach die Spalten in die to_html()Methode.

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