TypeError: argument of type 'float' is not iterable

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
monkiiiii
User
Beiträge: 13
Registriert: Mittwoch 13. Oktober 2021, 15:44

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
Sirius3
User
Beiträge: 18225
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13929
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Benutzeravatar
pillmuncher
User
Beiträge: 1527
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@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.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
__blackjack__
User
Beiträge: 13929
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Antworten