Wie kann ich mithilfe von pandas read_clipboard effektiv Daten zu Fragen zum Stapelüberlauf laden?

Dec 20 2020

Ich stelle fest, dass viele Pandas-Fragen zu Stack Overflow nur einige Zeilen ihrer Daten als Text enthalten, ohne den zugehörigen Code zum Generieren / Reproduzieren. Ich bin mir der Existenz bewusst, kann read_clipboardaber nicht herausfinden, wie diese Funktion effektiv aufgerufen werden kann, um Daten in vielen Situationen zu lesen, z. B. wenn die Headernamen Leerzeichen enthalten, oder Python-Objekte wie Listen in den Spalten.

Wie kann ich pd.read_clipboardDaten, die in unkonventionellen Formaten eingefügt wurden und sich nicht einfach mit den Standardargumenten lesen lassen, effektiver lesen? Gibt es Situationen, in denen read_clipboardes zu kurz kommt?

Antworten

4 cs95 Dec 20 2020 at 17:46

read_clipboard: Ratgeber für Anfänger


read_clipboardist wirklich eine Rettung für jeden, der anfängt, Fragen im Pandas- Tag zu beantworten . Leider wissen Pandas-Veteranen auch, dass die in Fragen angegebenen Daten aufgrund verschiedener Komplikationen im Format der veröffentlichten Daten nicht immer einfach in ein Terminal zu gelangen sind.

Zum Glück read_clipboardhat Argumente, die die Behandlung der meisten dieser Fälle möglich (und einfach) machen. Hier sind einige häufige Anwendungsfälle und ihre entsprechenden Argumente.


Häufige Anwendungsfälle

read_clipboardwird read_csvunter der Haube mit Leerzeichen-Trennzeichen verwendet, daher gelten hier viele Techniken zum Parsen von Daten aus CSV, z

  • Analysieren von Spalten mit Leerzeichen in den Daten

    • Verwendung sepmit Regex-Argument. Stellen Sie zunächst sicher, dass zwischen den Spalten mindestens zwei Leerzeichen und höchstens ein aufeinanderfolgendes Leerzeichen in den Daten der Spalte selbst vorhanden sind. Dann können Sie Folgendes verwenden sep=r'\s{2,}': "Spalten trennen, indem Sie nach mindestens zwei aufeinander folgenden Leerzeichen für das Trennzeichen suchen" (Hinweis: engine='python'ist für Trennzeichen mit mehreren Zeichen oder regulären Ausdrücken erforderlich):

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

      Siehe auch Wie gehen Sie mit Spaltennamen um, die Leerzeichen enthalten, wenn Sie pd.read_clipboard verwenden? .

  • Lesen einer Serie anstelle von DataFrame

    • Verwenden squeeze=trueSie wahrscheinlich auch, header=Nonewenn die erste Zeile auch Daten enthält.

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

      Siehe auch Könnte es eine einfachere Möglichkeit geben, mit pandas read_clipboard eine Serie zu lesen? .

  • Laden von Daten mit benutzerdefinierten Headernamen

    • Verwendung names=[...]in Verbindung mit header=Noneund skiprows=[0]zum Ignorieren vorhandener Header.

       df = pd.read_clipboard(..., header=None, names=['a', 'b', 'c'], skiprows=[0])
      
  • Laden von Daten ohne Header

    • verwenden header=None
  • Legen Sie eine oder mehrere Spalten als Index fest

    • Verwenden Sie index_col=[...]mit dem entsprechenden Etikett oder Index
  • Analysedaten

    • Verwenden Sie parse_datesmit dem entsprechenden Format. Beim Parsen datetimes(dh Spalten mit durch Zeitstempel getrenntem Datum) müssen Sie wahrscheinlich auch verwenden, sep=r'\s{2,}'während Sie sicherstellen, dass Ihre Spalten durch mindestens zwei Leerzeichen getrennt sind.

In dieser Antwort von mir finden Sie eine umfassendere Liste der read_csvArgumente für andere Fälle, die hier nicht behandelt werden ...


Vorsichtsmaßnahmen

read_clipboardist ein Schweizer Taschenmesser. Wie auch immer, es

  • Daten können nicht in hübschen Tabellen- / Tabellenformaten gelesen werden (IOW, Rahmen erschweren dies)

    • Siehe Einlesen eines hübsch gedruckten / formatierten Datenrahmens mit pd.read_clipboard? für Lösungen, um dies anzugehen.
  • MultIndexes können nur dann korrekt analysiert werden, wenn alle Elemente im Index angegeben sind.

    • Siehe Kopieren von MultiIndex-Datenrahmen mit pd.read_clipboard? für Lösungen, um dies anzugehen.
  • Ellipsen in Daten können nicht ignoriert / verarbeitet werden

    • Meine vorgeschlagene Methode besteht darin, Ellipsen vor dem Drucken manuell zu entfernen
  • Spalten von Listen (oder anderen Objekten) können nur als Zeichenfolge analysiert werden. Die Spalten müssen separat konvertiert werden, wie unter Wie liest man einen Datenrahmen mit Listen mit pd.read_clipboard ein? .

  • kann keinen Text aus Bildern lesen (bitte verwenden Sie Bilder nicht als Mittel, um Ihre Daten mit anderen zu teilen, bitte!)

2 etch_45 Dec 20 2020 at 18:23

Die einzige Schwäche dieser Funktion ist, dass sie keinen Inhalt erfasst, CTRL + Cwenn die Kopie aus einer PDFDatei ausgeführt wird. Das Testen auf diese Weise führt zu einem leeren Lesevorgang.

Aber mit einem normalen Texteditor geht es gut. Hier ist ein Beispiel mit zufällig eingegebenem Text:

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