Pandy tworzą puste ramki DataFrame zawierające tylko nazwy kolumn

151

Mam dynamiczną ramkę DataFrame, która działa dobrze, ale gdy nie ma żadnych danych do dodania do ramki DataFrame, pojawia się błąd. Dlatego potrzebuję rozwiązania, aby utworzyć pustą ramkę DataFrame z tylko nazwami kolumn.

Na razie mam coś takiego:

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

PS: Ważne jest, aby nazwy kolumn nadal pojawiały się w DataFrame.

Ale kiedy używam tego w ten sposób, w rezultacie otrzymuję coś takiego:

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

Część „Empty DataFrame” jest dobra! Ale zamiast rzeczy z indeksem nadal muszę wyświetlać kolumny.

Edytować:

Ważna rzecz, o której się dowiedziałem: konwertuję tę ramkę DataFrame na plik PDF za pomocą Jinja2, dlatego wzywam metodę, aby najpierw wyprowadzić ją do HTML w następujący sposób:

df.to_html()

Myślę, że w tym miejscu kolumny się gubią.

Edit2: Ogólnie podążałem za tym przykładem: http://pbpython.com/pdf-reports.html . CSS również pochodzi z linku. Oto, co robię, aby wysłać ramkę danych do pliku 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:

Jeśli wydrukuję ramkę danych zaraz po utworzeniu, otrzymam następujące informacje:

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

Wydaje się to rozsądne, ale jeśli wydrukuję 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>'

I wydaje się, że kolumn już brakuje.

E4: Jeśli wydrukuję następujące informacje:

print(df.to_html())

Otrzymuję już następujący wynik:

<table border="1" class="dataframe">
  <tbody>
    <tr>
      <td>Index([], dtype='object')</td>
      <td>Empty DataFrame</td>
    </tr>
  </tbody>
</table>
E. Muuli
źródło
Czy poniższe rozwiązanie teraz Ci odpowiada? Jeśli nie, powinieneś podać więcej informacji o swoim środowisku, takich jak wersja Pythona, wersja Pandy itp.
Marcus V.,
Używam Pythona w wersji 3.4, Pandas w wersji 0.13.1
E. Muuli
1
Cześć Eerik, nie mogę odtworzyć tego, co masz w E4. Jeśli to zrobię, wydruk wygląda tak, jak mam poniżej. Czy mógłbyś zaktualizować swoją wersję pandy? Bo twój jest raczej stary (jestem na 0.20.1).
Marcus V.
1
Dzięki, aktualizacja Pand działała!
E. Muuli

Odpowiedzi:

190

Możesz utworzyć pustą ramkę DataFrame z nazwami kolumn lub indeksem:

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

Lub

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]

Edycja: Nie mogę odtworzyć nawet po twojej poprawce z .to_html. To:

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

Produkuje:

<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.
źródło
Redagowałem główne pytanie, czy to pomaga. E: Ponownie edytowany.
E. Muuli
9

Szukasz czegoś takiego?

    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
źródło
Poza tym nie straciłem nazw kolumn, kiedy próbowałem. Jest w formacie tabeli html.
Linda
3

df.to_html() ma parametr kolumny.

Po prostu przekaż kolumny do to_html()metody.

df.to_html(columns=['A','B','C','D','E','F','G'])
Eric
źródło