Los pandas crean un marco de datos vacío con solo nombres de columna

4 minutos de lectura

avatar de usuario
E. Muuli

Tengo un marco de datos dinámico que funciona bien, pero cuando no hay datos para agregar al marco de datos, aparece un error. Y, por lo tanto, necesito una solución para crear un DataFrame vacío con solo los nombres de las columnas.

Por ahora tengo algo como esto:

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

PD: es importante que los nombres de las columnas sigan apareciendo en un DataFrame.

Pero cuando lo uso así, obtengo algo así como resultado:

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

¡La parte “Empty DataFrame” es buena! Pero en lugar del Índice, todavía necesito mostrar las columnas.

Editar:

Una cosa importante que descubrí: estoy convirtiendo este DataFrame a un PDF usando Jinja2, por lo tanto, estoy llamando a un método para enviarlo primero a HTML así:

df.to_html()

Aquí es donde las columnas se pierden, creo.

Edit2: En general, seguí este ejemplo: http://pbpython.com/pdf-informes.html. El css también es del enlace. Eso es lo que hago para enviar el marco de datos 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:

Si imprimo el marco de datos justo después de la creación, obtengo lo siguiente:

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

Eso parece razonable, pero si imprimo 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>'

Y parece que ya faltan las columnas.

E4: Si imprimo lo siguiente:

print(df.to_html())

Ya obtengo el siguiente resultado:

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

avatar de usuario
marco v

Puede crear un marco de datos vacío con nombres de columna o un í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: []

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]

Editar: incluso después de su enmienda con .to_html, no puedo reproducir. Este:

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>

¿Estás buscando algo como esto?

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

  • stackoverflow.com/questions/33155776/…

    – Linda

    13 de junio de 2017 a las 6:49


  • Además, no perdí los nombres de mis columnas cuando lo intenté. Está en un formato de tabla html.

    – Linda

    13 de junio de 2017 a las 6:52

avatar de usuario
bitbang

Creando conombres con iterating

df = pd.DataFrame(columns=['colname_' + str(i) for i in range(5)])
print(df)

# Empty DataFrame
# Columns: [colname_0, colname_1, colname_2, colname_3, colname_4]
# Index: []

to_html() operaciones

print(df.to_html())

# <table border="1" class="dataframe">
#   <thead>
#     <tr style="text-align: right;">
#       <th></th>
#       <th>colname_0</th>
#       <th>colname_1</th>
#       <th>colname_2</th>
#       <th>colname_3</th>
#       <th>colname_4</th>
#     </tr>
#   </thead>
#   <tbody>
#   </tbody>
# </table>

esto parece funcionar

print(type(df.to_html()))
# <class 'str'>

El problema es causado por

cuando creas df como este

df = pd.DataFrame(columns=COLUMN_NAMES)

Tiene 0 rows × n columnsnecesita crear al menos un índice de fila por

df = pd.DataFrame(columns=COLUMN_NAMES, index=[0])

ahora tiene 1 rows × n columns. Puede agregar datos. De lo contrario, es df que solo consiste en objetos de nombres de columnas (como una lista de cadenas).

  • Muchas gracias a ti. Luché por no poder agregar datos durante 2 horas

    – Mikk

    20 abr a las 9:43

avatar de usuario
eric

df.to_html() tiene un parámetro de columnas.

Simplemente pase las columnas al to_html() método.

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad