Pandas criam DataFrame vazio com apenas nomes de colunas


151

Eu tenho um DataFrame dinâmico que funciona bem, mas quando não há dados a serem adicionados ao DataFrame, recebo um erro. E, portanto, preciso de uma solução para criar um DataFrame vazio com apenas os nomes das colunas.

Por enquanto, tenho algo parecido com isto:

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

PS: é importante que os nomes das colunas ainda apareçam em um DataFrame.

Mas quando eu uso assim, recebo algo assim como resultado:

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

A parte "Empty DataFrame" é boa! Mas, em vez da coisa do Índice, ainda preciso exibir as colunas.

Editar:

Uma coisa importante que eu descobri: estou convertendo esse DataFrame em um PDF usando o Jinja2, portanto, estou chamando um método para o primeiro gerar como HTML:

df.to_html()

É aqui que as colunas se perdem, eu acho.

Edit2: Em geral, segui este exemplo: http://pbpython.com/pdf-reports.html . O css também é do link. É o que faço para enviar o quadro de dados para o 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 eu imprimir o dataframe logo após a criação, obtenho o seguinte:

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

Isso parece razoável, mas se eu imprimir os 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 parece que as colunas já estão faltando.

E4: Se eu imprimir o seguinte:

print(df.to_html())

Já recebo o seguinte resultado:

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

O abaixo agora funciona para você? Se não, você deve fornecer mais informações sobre o ambiente, como versão Python, versão Pandas, etc.
Marcus V.

Estou usando o Python v3.4, Pandas v0.13.1
E. Muuli

1
Oi Eerik, não consigo reproduzir o que você tem no E4. Se fizer isso, a impressão será igual à que tenho abaixo. Você poderia atualizar sua versão do pandas? Porque o seu é bastante antigo (estou em 0.20.1).
Marcus V.

1
Obrigado, atualizando o Pandas funcionou!
E. Muuli

Respostas:


190

Você pode criar um DataFrame vazio com nomes de colunas ou um Índice:

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: Mesmo após a sua alteração com o .to_html, não consigo reproduzir. Este:

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

Produz:

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

Eu editei a pergunta principal, se isso ajuda. E: Editado novamente.
E. Muuli

9

Você está procurando algo parecido com isto?

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


Além disso, não perdi os nomes das minhas colunas quando tentei. Está em um formato de tabela html.
Linda

3

df.to_html() possui um parâmetro de colunas.

Basta passar as colunas para o to_html()método

df.to_html(columns=['A','B','C','D','E','F','G'])
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.