Como posso carregar dados de maneira eficaz em questões de Stack Overflow usando o pandas read_clipboard?

Dec 20 2020

Percebo que muitas perguntas do pandas no Stack Overflow incluem apenas algumas linhas de seus dados como texto, sem o código que o acompanha para gerá-lo / reproduzi-lo. Estou ciente da existência de, read_clipboardmas não consigo descobrir como efetivamente chamar essa função para ler dados em muitas situações, como quando há espaços em branco nos nomes dos cabeçalhos ou objetos Python, como listas nas colunas.

Como posso usar pd.read_clipboardmais efetivamente para ler dados colados em formatos não convencionais que não se prestam a uma leitura fácil usando os argumentos padrão? Existem situações em que read_clipboardfalha?

Respostas

4 cs95 Dec 20 2020 at 17:46

read_clipboard: Guia do iniciante


read_clipboardé realmente uma graça salvadora para quem está começando a responder a perguntas na marca pandas . Infelizmente, os veteranos dos pandas também sabem que os dados fornecidos nas perguntas nem sempre são fáceis de inserir em um terminal devido a várias complicações no formato dos dados postados.

Felizmente, read_clipboardtem argumentos que tornam o tratamento da maioria desses casos possível (e fácil). Aqui estão alguns casos de uso comuns e seus argumentos correspondentes.


Casos de uso comuns

read_clipboardusa read_csvsob o capô com separador de espaço em branco, portanto, muitas das técnicas para analisar dados de CSV se aplicam aqui, como

  • analisar colunas com espaços nos dados

    • use sepcom o argumento regex. Primeiro, certifique-se de que haja pelo menos dois espaços entre as colunas e no máximo um espaço em branco consecutivo dentro dos próprios dados da coluna. Em seguida, você pode usar o sep=r'\s{2,}'que significa "colunas separadas procurando por pelo menos dois espaços em branco consecutivos para o separador" (observação: engine='python'é necessário para separadores multichar ou regex):

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

      Veja também Como você lida com nomes de colunas com espaços ao usar pd.read_clipboard? .

  • lendo uma série em vez de DataFrame

    • usar squeeze=true, você provavelmente também precisará header=Nonese a primeira linha também for de dados.

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

      Veja também: Existe uma maneira mais fácil de usar o pandas read_clipboard para ler uma série? .

  • carregando dados com nomes de cabeçalho personalizados

    • use names=[...]em conjunto com header=Nonee skiprows=[0]para ignorar os cabeçalhos existentes.

       df = pd.read_clipboard(..., header=None, names=['a', 'b', 'c'], skiprows=[0])
      
  • carregando dados sem cabeçalhos

    • usar header=None
  • defina uma ou mais colunas como o índice

    • use index_col=[...]com o rótulo ou índice apropriado
  • análise de datas

    • use parse_datescom o formato apropriado. Se estiver analisando datetimes(ou seja, colunas com data separada por carimbo de data / hora), você provavelmente também precisará usar sep=r'\s{2,}', garantindo que suas colunas sejam separadas por pelo menos dois espaços.

Veja esta resposta minha para uma lista mais abrangente de read_csvargumentos para outros casos não cobertos aqui ...


Ressalvas

read_clipboardé um canivete suíço. no entanto

  • não pode ler dados em formatos prettytable / tabulate (IOW, as bordas tornam isso mais difícil)

    • Consulte Lendo em um dataframe bem impresso / formatado usando pd.read_clipboard? para soluções para lidar com isso.
  • não pode analisar corretamente MultIndexes, a menos que todos os elementos no índice sejam especificados.

    • Consulte Copiando dataframes MultiIndex com pd.read_clipboard? para soluções para lidar com isso.
  • não pode ignorar / manipular elipses nos dados

    • meu método sugerido é remover manualmente as elipses antes de imprimir
  • não pode analisar colunas de listas (ou outros objetos) como algo diferente de string. As colunas precisarão ser convertidas separadamente, conforme mostrado em Como você lê em um dataframe com listas usando pd.read_clipboard? .

  • não pode ler texto de imagens (por favor, não use imagens como um meio de compartilhar seus dados com as pessoas, por favor!)

2 etch_45 Dec 20 2020 at 18:23

O único ponto fraco dessa função é que ela não captura o conteúdo de CTRL + Cse a cópia é realizada de um PDFarquivo. Testar dessa forma resulta em uma leitura vazia.

Mas, usando um editor de texto normal, tudo corre bem. Aqui está um exemplo usando texto digitado aleatoriamente:

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