Pandas maakt leeg DataFrame met alleen kolomnamen

Ik heb een dynamisch DataFrame dat prima werkt, maar als er geen gegevens in het DataFrame worden toegevoegd krijg ik een foutmelding. En daarom heb ik een oplossing nodig om een leeg DataFrame te maken met alleen de kolomnamen.

Op dit moment heb ik iets als dit:

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

PS: Het is belangrijk dat de kolomnamen nog steeds in een DataFrame zouden verschijnen.

Maar als ik het zo gebruik krijg ik zoiets als dit als resultaat:

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

Het "Empty DataFrame" gedeelte is goed! Maar in plaats van het Index ding moet ik nog steeds de kolommen weergeven.

Bewerken:

Een belangrijk ding dat ik ontdekte: Ik converteer dit DataFrame naar een PDF met behulp van Jinja2, dus vandaar dat ik'een methode aanroep om het eerst zo naar HTML uit te voeren:

df.to_html()

Dit is waar de kolommen verloren gaan denk ik.

Edit2: In het algemeen heb ik dit voorbeeld gevolgd: http://pbpython.com/pdf-reports.html. De css is ook van de link. Dat's wat ik doe om het dataframe naar de PDF te sturen:

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:

Als ik het dataframe direct na aanmaak uitprint krijg ik het volgende:

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

Dat lijkt redelijk, maar als ik de template_vars uitprint:

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

En het lijkt erop dat de kolommen al ontbreken.

E4: Als ik het volgende uitprint:

print(df.to_html())

krijg ik al het volgende resultaat:

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

U kunt een leeg DataFrame maken met kolomnamen of een 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: []

Of

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]

Bewerken: Zelfs na uw wijziging met de .to_html, kan ik'niet reproduceren. Dit:

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

Produceert:

<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>
Commentaren (1)

Bent u op zoek naar iets als dit?

    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')
Commentaren (4)

df.to_html() heeft een kolommen parameter.

Geef de kolommen gewoon door in de to_html() methode.

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