Dataframe letzte Zeile Problem in pandas

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
tmessers
User
Beiträge: 28
Registriert: Dienstag 30. Oktober 2018, 21:08

Mittwoch 16. Dezember 2020, 11:28

Hallo liebe Python-Gemeinde,
ich habe hier ein Problem, über das ihr sicher schmunzeln werdet.
Ich habe folgenden DataFrame:

A B C D E F
10.12. 166.7 153 247.8 132.4 154.8 237.3
12.12. 146.8 156 273.2 142.7 169.6 253.8
13.12. 146.8 156 273.2 142.7 169.6 253.8
14.12. 166.7 158.6 291.8 144 192.8 276
15.12. 166.7 150.8 275.7 139.7 195.4 268.1
16.12. 166.7 150.8 275.7 139.7 195.4 268.1

Ich möchte den Wert in Zelle 16.12./A ermitteln.

So möchte ich das tun:

Code: Alles auswählen

# ——-Wert ermitteln
    i = len(df_graf)-1
    print (i)

    wert_a = int(df_graf.iloc[i][0])
    print (wert_a)
i wird korrekt mit 5 berechnet.

Ich bekomme bei der Ausführung folgenden Fehlermeldung:
"ValueError: invalid literal for int() with base 10: '166.7'"

Setzte ich i = i - 1, dann erfolgt ein fehlerfreier Durchlauf.

Ich kann mit das nicht erklären. Wo liegt mein Denkfehler oder was mache ich falsch?

Gruß

tmessers
__deets__
User
Beiträge: 9824
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 16. Dezember 2020, 11:50

Ist denn die Zahl 166.7 eine Ganzzahl?
tmessers
User
Beiträge: 28
Registriert: Dienstag 30. Oktober 2018, 21:08

Mittwoch 16. Dezember 2020, 12:39

Nein, ist sie nicht. Sie ist doch im DataFrame ein string, oder nicht?
Warum bekomme ich aber wenn ich i = i -1 setze, für wert_a = 166?
Mit int("166,7") wandle ich doch den String 166.7 in einen Integer um, oder liege ich hier falsch?
einfachTobi
User
Beiträge: 323
Registriert: Mittwoch 13. November 2019, 08:38

Mittwoch 16. Dezember 2020, 13:27

Der Werte dürfte eher ein numpy.float64 als ein String sein. Das solltest du für dich mal prüfen.
Wenn du jedoch ohnehin nur den letzten Wert haben willst, kannst du ihn auch mit -1 erhalten:

Code: Alles auswählen

print(df_graf.A.iloc[-1])
print(df_graf.iloc[-1][-1])
Benutzeravatar
__blackjack__
User
Beiträge: 8699
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mittwoch 16. Dezember 2020, 14:14

@tmessers: Offenbar hast Du da Zeichenketten in der Spalte stehen und das hat dann überhaupt gar nichts mit dem DateFrame zu tun, `int()` muss eine Zeichenkette bekommen mit einem Inhalt der eine ganze Zahl darstellt. "166.7" ist das nicht:

Code: Alles auswählen

In [128]: int("166.7")                                                          
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-128-40c50ccbffe6> in <module>
----> 1 int("166.7")

ValueError: invalid literal for int() with base 10: '166.7'
Die Frage die sich da aufdrängt ist natürlich warum das Zeichenketten sind in der Spalte‽
long long ago; /* in a galaxy far far away */
tmessers
User
Beiträge: 28
Registriert: Dienstag 30. Oktober 2018, 21:08

Mittwoch 16. Dezember 2020, 21:45

@einfachTobi: es ist definitiv ein string
Ich habe mein Problem so gelöst

dat= df_graf.iloc[-1][0]
print(type(dat)) # ergibt <class 'str'>

cols = list(df_graf.columns[df_graf.dtypes.eq('object')])
print(cols)
df_graf[cols] = df_graf[cols].apply( pd.to_numeric, errors='coerce' )

dat = df_graf.iloc[-1][0]
print( type( dat ) ) # ergibt <class 'numpy.float64'>
tmessers
User
Beiträge: 28
Registriert: Dienstag 30. Oktober 2018, 21:08

Mittwoch 16. Dezember 2020, 21:48

@__blackjack__:
Ich erzeuge den DataFrame mit BeautifulSoup. Deshalb ist der Wert wahrscheinlich ein String.
Antworten