¿Cómo manejar el índice con nombre personalizado al copiar un dataframe usando pd.read_clipboard?

Dado este dataframe de alguna otra pregunta:

Constraint Name TotalSP Onpeak Offpeak Constraint_ID 77127 aaaaaaaaaaaaaaaaaa -2174.5 -2027.21 -147.29 98333 bbbbbbbbbbbbbbbbbb -1180.62 -1180.62 0 1049 cccccccccccccccccc -1036.53 -886.77 -149.76 

Parece que hay un índice Constraint_ID . Cuando bash leerlo con pd.read_clipboard , así es como se carga:

  Constraint Name TotalSP Onpeak Offpeak 0 Constraint_ID NaN NaN NaN NaN 1 77127 aaaaaaaaaaaaaaaaaa -2174.50 -2027.21 -147.29 2 98333 bbbbbbbbbbbbbbbbbb -1180.62 -1180.62 0.00 3 1049 cccccccccccccccccc -1036.53 -886.77 -149.76 

Esto está claramente mal. ¿Cómo puedo corregir esto?

read_clipboard por defecto usa espacios en blanco para separar las columnas. El problema que ves es debido al espacio en blanco en la primera columna. Si especifica dos o más espacios como separador, en función del formato de la tabla, determinará la columna del índice en sí:

 df = pd.read_clipboard(sep='\s{2,}') df Out: Constraint Name TotalSP Onpeak Offpeak Constraint_ID 77127 aaaaaaaaaaaaaaaaaa -2174.50 -2027.21 -147.29 98333 bbbbbbbbbbbbbbbbbb -1180.62 -1180.62 0.00 1049 cccccccccccccccccc -1036.53 -886.77 -149.76 

index_col argumento index_col también se puede usar para decirle a los pandas que la primera columna es el índice, en caso de que la estructura no pueda inferirse del separador solo:

 df = pd.read_clipboard(index_col=0, sep='\s{2,}') 

Esto no es tan bueno como la respuesta de @ayhan, pero la mayoría de las veces funciona bastante bien. Suponiendo que está usando ipython o jupyter, simplemente copie y pegue los datos en el %%file :

Luego haz algunas ediciones rápidas. Con los índices múltiples, simplemente mueva el índice hacia arriba una línea, algo como esto (también acortando “ID de restricción” a “ID” para ahorrar un poco de espacio en este caso):

 %%file foo.txt ID Constraint Name TotalSP Onpeak Offpeak 77127 aaaaaaaaaaaaaaaaaa -2174.5 -2027.21 -147.29 98333 bbbbbbbbbbbbbbbbbb -1180.62 -1180.62 0 1049 cccccccccccccccccc -1036.53 -886.77 -149.76 pd.read_fwf('foo.txt') Out[338]: ID Constraint Name TotalSP Onpeak Offpeak 0 77127 aaaaaaaaaaaaaaaaaa -2174.50 -2027.21 -147.29 1 98333 bbbbbbbbbbbbbbbbbb -1180.62 -1180.62 0.00 2 1049 cccccccccccccccccc -1036.53 -886.77 -149.76 

read_fwf generalmente funciona bastante bien en cosas tabulares como esta, tratando correctamente los espacios en los nombres de las columnas (generalmente). Por supuesto, también puedes usar este método básico con read_csv .

Lo bueno de este método es que, para pequeños datos de muestra, puedes lidiar con cualquiera de las formas extrañas en que los usuarios publican datos aquí. Y hay muchas formas extrañas. 😉