Auf eine Zelle zugreifen mit .at

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Hallo,
das ist der Kopf meiner Tabelle:

Code: Alles auswählen

  Nr. Tag       Datum   Uhrzeit  Mst10  RSumme
0   1  Mo  10.12.2018  11:35:00  209.0     NaN
1   2  Mo  10.12.2018  11:40:00  195.0     NaN
2   3  Mo  10.12.2018  11:45:00  449.0     NaN
3   4  Mo  10.12.2018  11:50:00  156.0     NaN
4   5  Mo  10.12.2018  11:55:00  407.0     NaN
5   6  Mo  10.12.2018  12:00:00  290.0     NaN
6   7  Mo  10.12.2018  12:05:00  446.0     NaN
7   8  Mo  10.12.2018  12:10:00  430.0     NaN
8   9  Mo  10.12.2018  12:15:00  349.0     NaN
9  10  Mo  10.12.2018  12:20:00  245.0     NaN
Hier ist die Info Angabe von Pandas zur Tabelle:

Code: Alles auswählen

<class 'pandas.core.frame.DataFrame'>
Index: 34254 entries, 0 to 34253
Data columns (total 6 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   Nr.      34254 non-null  object 
 1   Tag      34254 non-null  object 
 2   Datum    34254 non-null  object 
 3   Uhrzeit  34254 non-null  object 
 4   Mst10    34254 non-null  float64
 5   RSumme   0 non-null      float64
dtypes: float64(2), object(4)
memory usage: 1.8+ MB
None
Ich möchte auf den 5 Wert von Mst10 zugreifen. Wenn ich

Code: Alles auswählen

print(TabR.at[5, 'Mst10'])
eingebe kommt immer folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):

  File "/home/kai/.local/lib/python3.8/site-packages/pandas/core/indexes/base.py", line 3080, in get_loc
    return self._engine.get_loc(casted_key)

  File "pandas/_libs/index.pyx", line 70, in pandas._libs.index.IndexEngine.get_loc

  File "pandas/_libs/index.pyx", line 101, in pandas._libs.index.IndexEngine.get_loc

  File "pandas/_libs/hashtable_class_helper.pxi", line 4554, in pandas._libs.hashtable.PyObjectHashTable.get_item

  File "pandas/_libs/hashtable_class_helper.pxi", line 4562, in pandas._libs.hashtable.PyObjectHashTable.get_item

KeyError: 5


The above exception was the direct cause of the following exception:

Traceback (most recent call last):

  File "/home/kai/Dokumente/Python/Auswertung_Matplotlib.py", line 77, in <module>
    print(TabR.at[5, 'Mst10'])

  File "/home/kai/.local/lib/python3.8/site-packages/pandas/core/indexing.py", line 2156, in __getitem__
    return super().__getitem__(key)

  File "/home/kai/.local/lib/python3.8/site-packages/pandas/core/indexing.py", line 2103, in __getitem__
    return self.obj._get_value(*key, takeable=self._takeable)

  File "/home/kai/.local/lib/python3.8/site-packages/pandas/core/frame.py", line 3144, in _get_value
    index = self.index.get_loc(index)

  File "/home/kai/.local/lib/python3.8/site-packages/pandas/core/indexes/base.py", line 3082, in get_loc
    raise KeyError(key) from err

KeyError: 5
Ich verstehe nicht was falsch läuft, irgendwas scheint mit der 5 nicht zu stimmen. Dabei müsste doch so ein Zugriff auf den Wert 290.0 möglich sein oder ?

Gruß Kai
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Code: Alles auswählen

print(TabR.at['5', 'Mst10'])
klappt, obwohl es https://pandas.pydata.org/pandas-docs/s ... me.at.html anders steht.

Gruß Kai

Ich glaube meine Indexzahlen werden als String geführt, in einer Schleife muss ich i in einen str umwandeln.

Code: Alles auswählen

for i in range(len(TabR)):
    if i == 0:
        print(i)
        TabR.at[str(i), 'RSumme']=TabR.at[str(i), 'Mst10']
    else:
        TabR.at[str(i), 'RSumme']=TabR.at[str(i), 'Mst10']+TabR.at[str(i-1), 'Mst10']
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kahnbein.Kai: Meine Güte was machst Du da für schreckliche Sachen. ``for``-Schleifen über alle Zeilen eines DataFrame — dann kannst Du Dir Pandas auch gleich sparen.

Du suchst die `shift()`-Methode auf `Series`-Objekten. Ungetestet: ``tab_r["RSumme"] = tab_r["Mst10"] + tab_r["Mst10"].shift(-1)``. So oder so ähnlich. Und nicht nur `tab_r` statt `TabR` sondern besser einen Namen bei dem der Leser nicht rätseln muss was der bedeuten soll.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Oder du gehst über deinen Index,

Code: Alles auswählen



wert = df["Mst10"].iloc[4] # 



In meinem simulierten Fall funktioniert mit:

Code: Alles auswählen

wert = df.at[4,"Mst10"]
alles bestens da du nur einen kleinen Teil deines Codes zeigst kann man dir leider nicht weiter helfen , Ich schätze das der Fehler iregendwo anders liegt
Eine Vision ohne Aktion bleibe eine Illusion
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Vielen Dank für die Antworten.

Zur Schleife über die ganze Tabelle, ich habe es nicht anders hinbekommen. Ich möchte halt nicht die Summe der kompletten Spalte in einem Wert ausgeben, sondern ein aufsummieren über jede Zeile.
So kann ich, das Summendiagramm plotten.

Soweit ich die Shiftmethode verstanden habe, verrückt diese den Zelleninhalt ? Ich muss sagen die Schleife war auch nicht richtig. In Code unten werden die richtigen Werte addiert.

Ich habe auch die originale CSV Datei hochgeladen.

Code: Alles auswählen

TabR = pd.read_csv('/home/kai/Dokumente/Python/Daten/mst10.csv', skiprows=[0,1], delimiter=';')

print(TabR.info())

TabR.drop(TabR.tail(6).index, inplace = True) 

del TabR['(Kommentar) []']

TabR = TabR.rename(index=str, columns={"Summe(mst10r) [mm]" : "Mst10"})

TabR['Mst10'] = TabR['Mst10'].str.replace(',','.').astype(float)

TabR['RSumme'] = np.nan

for i in range(len(TabR)):
    if i == 0:
        print(i)
        TabR.at[str(i), 'RSumme']=TabR.at[str(i), 'Mst10']
    else:
        TabR.at[str(i), 'RSumme']=TabR.at[str(i), 'Mst10']+TabR.at[str(i-1), 'RSumme']
        
print(TabR.head(10))
         
print(TabR.plot.line(figsize=(20, 5), subplots=True))        

Hier ist das Diagramm dazu.
Bild

Hier ist die CSV Datei:
https://we.tl/t-0yRK2LDGtI

Gruß Kai
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

Dann benutze cumsum ;-)
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

TabR['RSumme2']=TabR['Mst10'].cumsum(axis=0)

super, Danke für den Tipp. Das ist funktioniert ja wirklich gut.

Das der Funktion '.at' funktioniert leider immer noch nicht mit einem Integer :(.

Gruß Kai
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Das funktioniert auch, man muss nur den Index in Integer umwandlen :roll:

Code: Alles auswählen

TabR.index =TabR.index.map(int)
vorher:

Code: Alles auswählen

<class 'pandas.core.frame.DataFrame'>
Index: 34252 entries, 0 to 34251
Data columns (total 6 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   Nr.      34252 non-null  object 
 1   Tag      34252 non-null  object 
 2   Datum    34252 non-null  object 
 3   Uhrzeit  34252 non-null  object 
 4   Mst10    34252 non-null  float64
 5   RSumme   0 non-null      float64
dtypes: float64(2), object(4)
memory usage: 2.8+ MB
None
nachher:

Code: Alles auswählen

<class 'pandas.core.frame.DataFrame'>
Int64Index: 34252 entries, 0 to 34251
Data columns (total 6 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   Nr.      34252 non-null  object 
 1   Tag      34252 non-null  object 
 2   Datum    34252 non-null  object 
 3   Uhrzeit  34252 non-null  object 
 4   Mst10    34252 non-null  float64
 5   RSumme   34252 non-null  float64
dtypes: float64(2), object(4)
memory usage: 2.8+ MB
None
Antworten