Como posso carregar dados de maneira eficaz em questões de Stack Overflow usando o pandas read_clipboard?
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_clipboard
mais 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_clipboard
falha?
Respostas
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_clipboard
tem 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_clipboard
usa read_csv
sob 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
sep
com 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 osep=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=None
se 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 comheader=None
eskiprows=[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
- usar
defina uma ou mais colunas como o índice
- use
index_col=[...]
com o rótulo ou índice apropriado
- use
análise de datas
- use
parse_dates
com o formato apropriado. Se estiver analisandodatetimes
(ou seja, colunas com data separada por carimbo de data / hora), você provavelmente também precisará usarsep=r'\s{2,}'
, garantindo que suas colunas sejam separadas por pelo menos dois espaços.
- use
Veja esta resposta minha para uma lista mais abrangente de read_csv
argumentos 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!)
O único ponto fraco dessa função é que ela não captura o conteúdo de CTRL + C
se a cópia é realizada de um PDF
arquivo. 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: []