Zeichenfolgen in einem DataFrame, aber dtype ist ein Objekt

Lesezeit: 5 Minuten

Zeichenfolgen in einem DataFrame aber dtype ist ein Objekt
Xiphias

Warum sagt mir Pandas, dass ich Objekte habe, obwohl jedes Element in der ausgewählten Spalte ein String ist – auch nach expliziter Konvertierung.

Dies ist mein DataFrame:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 56992 entries, 0 to 56991
Data columns (total 7 columns):
id            56992  non-null values
attr1         56992  non-null values
attr2         56992  non-null values
attr3         56992  non-null values
attr4         56992  non-null values
attr5         56992  non-null values
attr6         56992  non-null values
dtypes: int64(2), object(5)

Fünf davon sind dtype object. Ich konvertiere diese Objekte explizit in Strings:

for c in df.columns:
    if df[c].dtype == object:
        print "convert ", df[c].name, " to string"
        df[c] = df[c].astype(str)

Dann, df["attr2"] hat immernoch dtype objectobwohl type(df["attr2"].ix[0] offenbart strwelches ist richtig.

Pandas unterscheiden zwischen int64 und float64 und object. Was ist die Logik dahinter, wenn es keine gibt dtype str? Warum ist ein str überdeckt von object?

  • Kam hierher, weil Joins aufgrund des ‘Objekttyps’ fehlschlagen, obwohl jede “ist”-Zeichenfolge

    – Monika Heddneck

    28. Januar 2020 um 22:51 Uhr

1644127627 495 Zeichenfolgen in einem DataFrame aber dtype ist ein Objekt
HYRY

Der dtype Objekt kommt von NumPy, es beschreibt den Typ des Elements in a ndarray. Jedes Element in einer ndarray muss dieselbe Größe in Bytes haben. Für int64 und float64, sie sind 8 Bytes. Bei Zeichenfolgen ist die Länge der Zeichenfolge jedoch nicht festgelegt. Anstatt also die Bytes von Strings in der ndarray direkt verwendet Pandas ein Objekt ndarray, das Zeiger auf Objekte speichert; deswegen die dtype Derartige ndarray ist Objekt.

Hier ist ein Beispiel:

  • Das int64-Array enthält 4 int64-Werte.
  • das Objekt-Array enthält 4 Zeiger auf 3 String-Objekte.

Geben Sie hier die Bildbeschreibung ein

  • Beachten Sie jedoch, dass das Vorhandensein von Spalten vom Typ „Objekt“ einen großen Einfluss auf die Leistung der DataFrame-Lese-/Schreibvorgänge hat

    – erwanp

    6. Juli 18 um 15:53 ​​Uhr

  • kann ich den Datentyp irgendwie als String zurückgeben. Ich weiß, dass ich immer type(df[“column”].iloc[0]), aber es kann passieren, dass es nan ist

    – Benutzer1953366

    28. April 19 um 08:12 Uhr

Zeichenfolgen in einem DataFrame aber dtype ist ein Objekt
Ben

@HYRYs Antwort ist großartig. Ich möchte nur etwas mehr Kontext liefern..

Arrays speichern Daten als zusammenhängend, feste Größe Speicherblöcke. Die Kombination dieser Eigenschaften macht Arrays blitzschnell für den Datenzugriff. Überlegen Sie beispielsweise, wie Ihr Computer ein Array von 32-Bit-Ganzzahlen speichern könnte, [3,0,1].

Geben Sie hier die Bildbeschreibung ein

Wenn Sie Ihren Computer bitten, das dritte Element im Array abzurufen, beginnt er am Anfang und springt dann über 64 Bit, um zum dritten Element zu gelangen. Genau zu wissen, wie viele Bits übersprungen werden müssen, macht Arrays schnell.

Betrachten Sie nun die Reihenfolge der Zeichenfolgen ['hello', 'i', 'am', 'a', 'banana']. Zeichenfolgen sind Objekte unterschiedlicher Größe. Wenn Sie also versuchen würden, sie in zusammenhängenden Speicherblöcken zu speichern, würde es am Ende so aussehen.

Geben Sie hier die Bildbeschreibung ein

Jetzt hat Ihr Computer keine schnelle Möglichkeit, auf ein zufällig angefordertes Element zuzugreifen. Der Schlüssel zur Überwindung dieses Problems ist die Verwendung von Zeigern. Speichern Sie im Grunde jede Zeichenfolge an einem beliebigen Speicherort und füllen Sie das Array mit der Speicheradresse jeder Zeichenfolge. (Speicheradressen sind nur Ganzzahlen.) Nun sieht es also so aus

Geben Sie hier die Bildbeschreibung ein

Wenn Sie nun Ihren Computer bitten, das dritte Element abzurufen, kann er wie zuvor über 64 Bit springen (vorausgesetzt, die Speicheradressen sind 32-Bit-Ganzzahlen) und dann einen zusätzlichen Schritt ausführen, um die Zeichenfolge abzurufen.

Die Herausforderung für NumPy besteht darin, dass es keine Garantie dafür gibt, dass die Zeiger tatsächlich auf Zeichenfolgen zeigen. Deshalb meldet es den dtype als ‘object’.

Ich werde schamlos meine eigenen anschließen Kurs auf NumPy wo ich das ursprünglich besprochen habe.

  • Schön geschrieben..Danke

    – teddcp

    8. Mai 20 um 9:31 Uhr

  • @Ben: Danke für deine Antwort. Unabhängige Frage: Wie haben Sie die Grafiken und Animationen in Ihrer Antwort erstellt???

    – hpi

    24. Januar 21 um 16:20 Uhr

  • @hpy Apple-Keynote

    – Ben

    26. Januar 21 um 16:57 Uhr

  • @Ben: Cool, danke! In der Lage zu sein, Dinge zu visualisieren, hilft sehr, sehr geschätzt.

    – hpi

    26. Januar 21 um 21:14 Uhr

Zeichenfolgen in einem DataFrame aber dtype ist ein Objekt
Die Rote Erbse

Die akzeptierte Antwort ist gut. Ich wollte nur verweisen die Dokumentation. Die Dokumentation sagt:

Pandas verwendet das Objekt dtype zum Speichern von Zeichenfolgen.

Die akzeptierte Antwort hat großartige Arbeit geleistet und das “Warum” erklärt. Zeichenfolgen haben eine variable Länge:

Bei Zeichenfolgen ist die Länge der Zeichenfolge jedoch nicht festgelegt.

Aber wie der führende Kommentar zu der akzeptierten Antwort einmal sagte: “Mach dir keine Sorgen; es soll so sein.”

  • Warum muss ich jede Spalte, die ich übergebe, in scipy oder sklearn astype(str) umwandeln, damit sie akzeptiert wird? Anscheinend sollte ich das zunächst auf alle Spalten anwenden können.

    – Tinkinc

    21. August 19 um 12:53 Uhr

  • Ich verstehe nicht; @Tinkinc was passiert wenn du nicht Spalten in String umwandeln? Und diese Antwort scheint eine elegante Möglichkeit zu sein, alle Spalten zu konvertieren astype(str) obwohl ich mich immer noch fragen würde, ob eine Zeichenfolgenkonvertierung erforderlich ist

    – Die rote Erbse

    21. August 19 um 14:35 Uhr

  • Ich kann nicht (0) alle Objekte in meinem Datenrahmen füllen (1,nan) statt (1,0)

    – Tinkinc

    21. August 19 um 16:03 Uhr

  • Entschuldigung @Tinkinc Ich verstehe immer noch nicht; Ich möchte helfen, aber Ihr Problem klingt komplexer als ein Stack Overflow-Kommentar. Erwägen Sie, eine Frage zu stellen oder sich mir im Chat anzuschließen. (hat dich gerade eingeladen)

    – Die rote Erbse

    21. August 19 um 16:31 Uhr

1644127630 755 Zeichenfolgen in einem DataFrame aber dtype ist ein Objekt
Flüchtling

Ab Version 1.0.0 (Januar 2020) hat Pandas als experimentelles Feature eingeführt, das eine erstklassige Unterstützung für String-Typen bietet pandas.StringDtype.

Während Sie noch sehen werden object Standardmäßig kann der neue Typ verwendet werden, indem a angegeben wird dtype von pd.StringDtype oder einfach 'string':

>>> pd.Series(['abc', None, 'def'])
0     abc
1    None
2     def
dtype: object
>>> pd.Series(['abc', None, 'def'], dtype=pd.StringDtype())
0     abc
1    <NA>
2     def
dtype: string
>>> pd.Series(['abc', None, 'def']).astype('string')
0     abc
1    <NA>
2     def
dtype: string

.

793300cookie-checkZeichenfolgen in einem DataFrame, aber dtype ist ein Objekt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy