Frage zu pandas, Datentypen, map

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Buchfink
User
Beiträge: 193
Registriert: Samstag 11. September 2021, 10:16

Hallo zusammen,

ich habe mich nun länger nicht mehr hier blicken lassen, da ich beruflich ziemlich viel zu tun habe und Python ja leider nur mal am Wochenende oder im Urlaub läuft.
Die meisten Probleme auf, die ich gestoßen bin, konnte ich auch mit goolge/nachdenken lösen und so kommt es nun, dass ich mich erst jetzt mal wieder hier melde.

Ziel ist, aus aktuellem Anlass einen Jungs-Namen zu finden. Da dies zu allerhand Diskussionen führte, kam mir der Gedanke, das algorithmisch zu lösen, denn es gibt jede Menge Vornamen und da eine Auswahl zu treffen, ist eine ganz schöne Arbeit.

So hier mal mein vorläufiger Code:

Code: Alles auswählen

import pandas as pd
from pathlib import Path


BASE_PATH = Path("Daten", "Namen")


df = pd.read_csv('https://raw.githubusercontent.com/fxnn/vornamen/master/Vornamen_Koeln_2017.csv')
df_m = df[df.geschlecht == "m"].copy()
df_m["Erster_Buchstabe"] = df_m["vorname"].str[0:1]
df_m["Letzter_Buchstabe"] = df_m["vorname"].str[-1:]
df_m["Laenge"] = df_m["vorname"].map(len)
df_m = df_m[df_m["Letzter_Buchstabe"] == "o"]
BASE_PATH.mkdir(parents=True, exist_ok=True)
df_m.to_csv(BASE_PATH / "ergebnis.csv", sep=';')
print(df_m)

print(df_m.dtypes)
er führt zu folgender Fehlermeldung:

Code: Alles auswählen

  File "pandas\_libs\lib.pyx", line 2859, in pandas._libs.lib.map_infer
TypeError: object of type 'float' has no len()
Im Hinblick auf "map" hatte ich mich hieran orientiert.
viewtopic.php?p=393255#p393255

Es mag sein, dass ich die Fehlermeldung falsch lese. Aber wieso denkt er dass "vorname" ein float sei?

Mit print(df_m.dtypes) hatte ich mir mal die Datentypen der Spalten ausgeben lassen. Dort ist "vorname" vom Typ "object".

Kann mir jemand einen kleinen Tipp geben, was ich falsch mache?

Gerne auch Verbesserungsvorschläge zum Code allgemein. :)

liebe Grüße
Benutzeravatar
__blackjack__
User
Beiträge: 13075
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Was Du falsch machst, ist das da offenbar nicht nur Zeichenketten in der Spalte sind:

Code: Alles auswählen

In [120]: df_m.info()                                                           
<class 'pandas.core.frame.DataFrame'>
Int64Index: 3563 entries, 3 to 6963
Data columns (total 5 columns):
 #   Column             Non-Null Count  Dtype 
---  ------             --------------  ----- 
 0   vorname            3562 non-null   object
 1   anzahl             3563 non-null   int64 
 2   geschlecht         3563 non-null   object
 3   Erster_Buchstabe   3562 non-null   object
 4   Letzter_Buchstabe  3562 non-null   object
dtypes: int64(1), object(4)
memory usage: 167.0+ KB

In [121]: df_m[~df_m.vorname.notnull()]                                         
Out[121]: 
     vorname  anzahl geschlecht Erster_Buchstabe Letzter_Buchstabe
1513     NaN       2          m              NaN               NaN
Es sind 3563 Einträge aber nur 3562 „non null“ in der Spalte "vorname". Da ist ein NaN-Wert drin und der ist vom Typ `float` und darauf kann man `len()` nicht aufrufen. Es gibt offenbar zwei männliche Babys von denen der Name unbekannt ist.

Du kannst das rausfiltern oder die dafür vorgesehene Methode `str.len()` verwenden: ``df_m["Laenge"] = df_m["vorname"].str.len()``
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Buchfink
User
Beiträge: 193
Registriert: Samstag 11. September 2021, 10:16

@__blackjack__
Danke für den Tipp.
Wie doof von mir :-(

Ich hatte die CSV auch mal händisch durchgescrollt. Dabei habe ich das wohl übersehen... Ups.... bisschen peinlich
Antworten