¿Cómo puedo cargar datos de manera efectiva en las preguntas de Stack Overflow usando pandas read_clipboard?

Dec 20 2020

Noto que muchas preguntas de pandas en Stack Overflow solo incluyen algunas filas de sus datos como texto, sin el código adjunto para generarlo / reproducirlo. Soy consciente de la existencia, read_clipboardpero no puedo averiguar cómo llamar eficazmente a esta función para leer datos en muchas situaciones, como cuando hay espacios en blanco en los nombres de los encabezados u objetos de Python como listas en las columnas.

¿Cómo puedo usar de manera pd.read_clipboardmás efectiva para leer datos pegados en formatos no convencionales que no se prestan a una lectura fácil usando los argumentos predeterminados? ¿Hay situaciones en las que se read_clipboardqueda corto?

Respuestas

4 cs95 Dec 20 2020 at 17:46

read_clipboard: Guía para principiantes


read_clipboardes realmente una gracia salvadora para cualquiera que comience a responder preguntas en la etiqueta pandas . Desafortunadamente, los veteranos de los pandas también saben que los datos proporcionados en las preguntas no siempre son fáciles de asimilar en un terminal debido a varias complicaciones en el formato de los datos publicados.

Afortunadamente, read_clipboardtiene argumentos que hacen posible (y fácil) manejar la mayoría de estos casos. A continuación, se muestran algunos casos de uso comunes y sus argumentos correspondientes.


Casos de uso común

read_clipboardutiliza read_csvbajo el capó con separador de espacios en blanco, por lo que muchas de las técnicas para analizar datos de CSV se aplican aquí, como

  • analizar columnas con espacios en los datos

    • usar sepcon argumento regex. Primero, asegúrese de que haya al menos dos espacios entre columnas y como máximo un espacio en blanco consecutivo dentro de los datos de la columna. Luego, puede usar lo sep=r'\s{2,}'que significa "columnas separadas buscando al menos dos espacios en blanco consecutivos para el separador" (nota: engine='python'es obligatorio para separadores de expresiones regulares o multichar):

       df = pd.read_clipboard(..., sep=r'\s{2,}', engine='python')
      

      Consulte también ¿Cómo maneja los nombres de columna que tienen espacios en ellos cuando usa pd.read_clipboard? .

  • leer una serie en lugar de DataFrame

    • utilizar squeeze=true, probablemente también necesitará header=Nonesi la primera fila también es de datos.

       s = pd.read_clipboard(..., header=None, squeeze=True)
      

      Consulte también ¿Podría haber una forma más fácil de usar pandas read_clipboard para leer una serie? .

  • cargar datos con nombres de encabezados personalizados

    • utilizar names=[...]junto con header=Nonee skiprows=[0]ignorar los encabezados existentes.

       df = pd.read_clipboard(..., header=None, names=['a', 'b', 'c'], skiprows=[0])
      
  • cargando datos sin encabezados

    • utilizar header=None
  • establecer una o más columnas como índice

    • utilizar index_col=[...]con la etiqueta o índice adecuados
  • analizar fechas

    • utilizar parse_datescon el formato apropiado. Si está analizando datetimes(es decir, columnas con fecha separadas por una marca de tiempo), es probable que también necesite usar sep=r'\s{2,}'mientras se asegura de que sus columnas estén separadas por al menos dos espacios.

Vea esta respuesta mía para obtener una lista más completa de read_csvargumentos para otros casos no cubiertos aquí ...


Advertencias

read_clipboardes una navaja suiza. De todos modos, eso

  • no puede leer datos en formatos prettytable / tabular (IOW, los bordes lo hacen más difícil)

    • Ver ¿ Lectura en un marco de datos bastante impreso / formateado usando pd.read_clipboard? en busca de soluciones para abordar esto.
  • no se pueden analizar correctamente los índices múltiples a menos que se especifiquen todos los elementos del índice.

    • Consulte ¿ Copiar marcos de datos MultiIndex con pd.read_clipboard? en busca de soluciones para abordar esto.
  • no puede ignorar / manejar elipses en los datos

    • mi método sugerido es eliminar manualmente las elipses antes de imprimir
  • no puede analizar columnas de listas (u otros objetos) como algo que no sea una cadena. Las columnas deberán convertirse por separado, como se muestra en ¿Cómo se lee en un marco de datos con listas usando pd.read_clipboard? .

  • no puede leer texto de imágenes (así que no use imágenes como un medio para compartir sus datos con la gente, ¡por favor!)

2 etch_45 Dec 20 2020 at 18:23

La única debilidad de esta función es que no captura el contenido de CTRL + Csi la copia se realiza desde un PDFarchivo. Probarlo de esta manera da como resultado una lectura vacía.

Pero al usar un editor de texto normal, funciona bien. Aquí hay un ejemplo que usa texto escrito al azar:

>>> pd.read_clipboard()
Empty DataFrame
Columns: [sfsesfsdsxcvfsdf]
Index: []