Jak skutecznie ładować dane w pytaniach o przepełnienie stosu za pomocą pandy read_clipboard?

Dec 20 2020

Zauważyłem, że wiele pytań dotyczących pand w Stack Overflow zawiera tylko kilka wierszy danych jako tekst, bez towarzyszącego kodu do ich wygenerowania / odtworzenia. Zdaję sobie sprawę z istnienia, read_clipboardale nie jestem w stanie dowiedzieć się, jak skutecznie wywołać tę funkcję w celu odczytania danych w wielu sytuacjach, na przykład gdy w nazwach nagłówków znajdują się spacje lub obiekty Pythona, takie jak listy w kolumnach.

W jaki sposób mogę pd.read_clipboardefektywniej czytać dane wklejone w niekonwencjonalnych formatach, które nie dają się łatwo odczytać przy użyciu domyślnych argumentów? Czy są sytuacje, w których read_clipboardjest mało?

Odpowiedzi

4 cs95 Dec 20 2020 at 17:46

read_clipboard: Przewodnik dla początkujących


read_clipboardjest naprawdę zbawczą łaską dla każdego, kto zaczyna odpowiadać na pytania w tagu pandy . Niestety, weterani pand wiedzą również, że dane podane w pytaniach nie zawsze są łatwe do wczytania do terminala z powodu różnych komplikacji w formacie publikowanych danych.

Na szczęście read_clipboardma argumenty, które sprawiają, że obsługa większości takich przypadków jest możliwa (i łatwa). Oto kilka typowych przypadków użycia i odpowiadające im argumenty.


Typowe przypadki użycia

read_clipboardużywa read_csvpod maską z separatorem białych znaków, więc stosuje się tutaj wiele technik analizowania danych z CSV, takich jak

  • analizowanie kolumn ze spacjami w danych

    • używaj sepz argumentem regex. Najpierw upewnij się, że między kolumnami są co najmniej dwie spacje i co najwyżej jedna kolejna biała spacja wewnątrz samych danych kolumny. Następnie możesz użyć sep=r'\s{2,}'co oznacza „oddzielne kolumny, szukając co najmniej dwóch następujących po sobie białych spacji dla separatora” (uwaga: engine='python'jest wymagane w przypadku separatorów wielokolorowych lub wyrażeń regularnych):

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

      Zobacz także Jak postępować w przypadku nazw kolumn zawierających spacje podczas korzystania z pd.read_clipboard? .

  • czytanie serii zamiast DataFrame

    • użycia squeeze=true, prawdopodobnie będziesz również potrzebować, header=Nonejeśli pierwszy wiersz to również dane.

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

      Zobacz także Czy może być łatwiejszy sposób używania pand read_clipboard do czytania serii? .

  • ładowanie danych z niestandardowymi nazwami nagłówków

    • używać names=[...]w połączeniu z header=Nonei skiprows=[0]do ignorowania istniejących nagłówków.

       df = pd.read_clipboard(..., header=None, names=['a', 'b', 'c'], skiprows=[0])
      
  • ładowanie danych bez żadnych nagłówków

    • posługiwać się header=None
  • ustawić jedną lub więcej kolumn jako indeks

    • używać index_col=[...]z odpowiednią etykietą lub indeksem
  • analizowanie dat

    • używać parse_datesz odpowiednim formatem. Jeśli analizujesz datetimes(tj. Kolumny z datą oddzieloną znacznikiem czasu), prawdopodobnie będziesz musiał użyć również sep=r'\s{2,}', upewniając się, że kolumny są oddzielone co najmniej dwoma spacjami.

Zobacz tę moją odpowiedź, aby uzyskać bardziej wyczerpującą listę read_csvargumentów dla innych przypadków nieobjętych tutaj ...


Ostrzeżenia

read_clipboardto nóż armii szwajcarskiej. Jednakże to

  • nie można odczytać danych w formatach prettytable / tabulate (IOW, obramowania utrudniają)

    • Zobacz Czytanie w ładnie wydrukowanej / sformatowanej ramce danych przy użyciu pd.read_clipboard? znaleźć rozwiązania, które pozwolą temu zaradzić.
  • nie może poprawnie przeanalizować MultIndexes, chyba że określono wszystkie elementy w indeksie.

    • Zobacz sekcję Kopiowanie ramek danych MultiIndex za pomocą pd.read_clipboard? znaleźć rozwiązania, które pozwolą temu zaradzić.
  • nie może ignorować / obsługiwać wielokropków w danych

    • moją sugerowaną metodą jest ręczne usunięcie elips przed drukowaniem
  • nie może analizować kolumn list (lub innych obiektów) jako niczego innego niż łańcuch. Kolumny będą musiały zostać przekonwertowane osobno, jak pokazano w Jak czytać w ramce danych z listami przy użyciu pd.read_clipboard? .

  • nie może odczytać tekstu z obrazów (więc nie używaj obrazów jako sposobu udostępniania danych innym, proszę!)

2 etch_45 Dec 20 2020 at 18:23

Jedyną słabością tej funkcji jest to, że nie przechwytuje zawartości, CTRL + Cjeśli kopia jest wykonywana z PDFpliku. Testowanie go w ten sposób skutkuje pustym odczytem.

Ale używając zwykłego edytora tekstu, wszystko idzie dobrze. Oto przykład wykorzystujący losowo wpisany tekst:

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