Jak skutecznie ładować dane w pytaniach o przepełnienie stosu za pomocą pandy read_clipboard?
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_clipboard
efektywniej 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_clipboard
jest mało?
Odpowiedzi
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_clipboard
ma 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_clipboard
używa read_csv
pod 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
sep
z 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=None
jeś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 zheader=None
iskiprows=[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
- posługiwać się
ustawić jedną lub więcej kolumn jako indeks
- używać
index_col=[...]
z odpowiednią etykietą lub indeksem
- używać
analizowanie dat
- używać
parse_dates
z odpowiednim formatem. Jeśli analizujeszdatetimes
(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.
- używać
Zobacz tę moją odpowiedź, aby uzyskać bardziej wyczerpującą listę read_csv
argumentów dla innych przypadków nieobjętych tutaj ...
Ostrzeżenia
read_clipboard
to 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ę!)
Jedyną słabością tej funkcji jest to, że nie przechwytuje zawartości, CTRL + C
jeśli kopia jest wykonywana z PDF
pliku. 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: []