Seite 1 von 1
TypeError: argument of type 'float' is not iterable
Verfasst: Dienstag 26. Oktober 2021, 13:46
von monkiiiii
start_stop = []
for string in s28["SAMPLE_MESSAGE"]:
if 'DISPLAY_FACE_CUE' in string:
start_stop(value).append("start_face")
elif 'DISPLAY_NBACK' in string:
start_stop(value).append("start_nback")
elif 'DISPLAY_FACE_CUE' in string:
start_stop(value+1000).append("stop_face")
elif 'DISPLAY_NBACK' in string:
start_stop(value+2000).append("stop_nback")
s28["start_stop"] = start_stop
print(s28)
TypeError: argument of type 'float' is not iterable
Dabei Habe ich zuvor die NaN's in der Spalte mit leeren Strings ersetzt.
s28.SAMPLE_MESSAGE.fillna(str(""))
Wenn ich versuche, den column type zu String zu wandeln:
s28['SAMPLE_MESSAGE'] = str(s28['SAMPLE_MESSAGE'])
wird mir über
s28.dtypes
weiterhin object für SAMPLE_MESSAGES gegeben.
Ist das überhaupt der richtige Weg, um eine neue Spalte zu erstellen, die sich an Strings in einer anderen Spalte orientieren? Die jeweilige Zelle kann auch mehr als den angegebenen String enthalten, daher hab ich die if... in... Formulierung gewählt.
Vielen Dank im Voraus,
monkiiiii
Re: TypeError: argument of type 'float' is not iterable
Verfasst: Dienstag 26. Oktober 2021, 14:04
von Sirius3
Das ist alles kein Python und erst recht kein idiomatisches Pandas.
Fange am besten mit einem Grundlagentutorial in Python an, arbeite das gründlich durch und setzte Dich dann an das Tutorial zu Pandas.
Wenn dann noch Fragen offen sind, kannst Du sie hier gerne stellen, aber hier im Forum Stück für Stück Code erfragen bringt Dich nicht weiter, weil Du mit den Antworten noch gar nicht anfangen kannst.
Und ja, es ist falsch, wenn man bei Pandas-Dataframes anfängt in for-Schleifen irgendwelche Werte zu verarbeiten.
Und zum Fehler: nur weil man etwas `string` nennt, ist das noch lange kein String.
Re: TypeError: argument of type 'float' is not iterable
Verfasst: Dienstag 26. Oktober 2021, 14:08
von __blackjack__
@monkiiiii: Das ist alles ein bisschen undurchsichtig und vor allem kann das so nicht sein. Am Anfang bindest Du `start_stop` an eine leere Liste und ein paar Zeilen weiter versuchst Du dann diese Liste wie eine Funktion aufzurufen. Eine Pandas-Spalte in ihre Zeichenkettendarstellung zu wandeln und dann wieder einer Spalte zuordnen zu wollen ist auch komisch bis — das geht eigentlich gar nicht würde ich sagen, oder zumindest nur in sehr exotischen Ausnahmefällen. Oder Pandas sieht eine Zeichenkette als Skalar. Dann bekommt jede Zelle in der ganzen Spalte die gleiche Zeichenkette zugewiesen.
Bei Fehlermeldungen bitte immer den kompletten Traceback zeigen, dann muss man nicht raten *wo* der Fehler auftritt.
Re: TypeError: argument of type 'float' is not iterable
Verfasst: Dienstag 26. Oktober 2021, 14:12
von pillmuncher
@monkiiiii:
Was ist denn s28? Wie unterscheidet es sich von s27 und s29? Und warum glaubst du, dass dir irgendjemand hier helfen kann, wenn du nur derart unvollständige Angaben zu deinem Problem machst? Das wurde dir auch schon von __deets__ in einem anderen Thread gesagt.
Da bleibt einem nur zu sagen: s28["SAMPLE_MESSAGE"] wird halt ein float sein und kein String. Was erwartest du denn, was passieren soll, wenn man zB. über π oder √2 iteriert? Und selbst, wenn das ein String wäre - wenn man über einen String iteriert, sind die Elemente einzelne Buchstaben. Wie kann denn zB. 'DISPLAY_FACE_CUE' in einem einzigen Buchstaben enthalten sein?
Sobald du das gelöst hast, wirst du einen TypeError: 'list' object is not callable bekommen, weil du versuchst, die Liste start_stop mit dem Argument value aufzurufen. Listen kann man nicht aufrufen.
Re: TypeError: argument of type 'float' is not iterable
Verfasst: Dienstag 26. Oktober 2021, 15:30
von __blackjack__
Falls `s28` ein DataFrame ist, dann bewirkt die Zuweisung einer Zeichenkette an eine ”Spalte”, dass da in jeder Zeile in dieser Spalte der gleiche Wert steht:
Code: Alles auswählen
In [6]: df["neu"] = "foobar"
In [7]: df
Out[7]:
test neu
0 42 foobar
1 23 foobar
2 4711 foobar
Und wenn man die alte Spalte nimmt, das `Series`-Objekt in eine Zeichenkette umwandelt, und dann wieder der Spalte zuordnet, dann hat man die selbe Zeichenkettenrepräsentation auch wieder in jeder Zeile als Zellenwert. Also dieses ``s28['SAMPLE_MESSAGE'] = str(s28['SAMPLE_MESSAGE'])`` ist maximal unsinnig:
Code: Alles auswählen
In [8]: df["test"] = str(df["test"])
In [9]: df
Out[9]:
test neu
0 0 42\n1 23\n2 4711\nName: test, d... foobar
1 0 42\n1 23\n2 4711\nName: test, d... foobar
2 0 42\n1 23\n2 4711\nName: test, d... foobar
In [10]: df["test"][0]
Out[10]: '0 42\n1 23\n2 4711\nName: test, dtype: int64'
Die gesuchten Teilzeichenketten sind dann entweder in *jeder* Zeiler, oder in *keiner* Zeile in dieser Spalte enthalten. Damit macht ein iterieren über die Werte keinen Sinn.
Hier sieht man aber auch, dass *die* Stelle gar nicht dafür verantwortlich sein, kann, denn `string` kommt aus einem `Series`-Objekt in dem Zeichenketten stecken sollten — sofern da tatsächlich das gemacht wird, was behauptet wurde.