Newbie: CSV Tabelle einlesen und in Zeilen und Spalten splitten

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
MuMPiTz
User
Beiträge: 27
Registriert: Freitag 27. Juli 2018, 15:07

Hallo,

Angneommen ich habe ein CSV Tabelle:

Bild

Zuerst würde ich gerne, zum Beispiel, aus Zeile 3, Spalte 4 mit Spalte 5 addieren. Kann mir jemand sagen wie ich das anstellen würde?
Sorry, saß grad 2 Stunden hier rum und habe versucht das hin zu bekommen, aber langsam qualmt mir ein bisschen der Kopf und
ich resigniere vor dieser wahrscheinlich recht einfachen Aufgabe.

Kann mir bitte jemand helfen?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du das mit pandas eingelesen hast, ist es nur ein data[3,4] + data[3, 5]
MuMPiTz
User
Beiträge: 27
Registriert: Freitag 27. Juli 2018, 15:07

__deets__ hat geschrieben: Montag 20. August 2018, 15:36 Wenn du das mit pandas eingelesen hast, ist es nur ein data[3,4] + data[3, 5]
So z.B.:
import pandas as pd

data = pd.read_csv('tabelle.csv')

summe = data[3,4] + data[3,5]

print(summe)
?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Probieren geht über studieren. Probier es aus. Wenn es nicht geht hast du zu deinem Code gleich noch ne Fehlermeldung die du AUCH postet kannst.
MuMPiTz
User
Beiträge: 27
Registriert: Freitag 27. Juli 2018, 15:07

Okay, also der code:
mport pandas as pd

data = pd.read_csv('tabelle.csv')

summe = data[3,4] + data[3,5]

print(summe)
gibt folgende Fehlermeldung aus:
Traceback (most recent call last):
File "C:\Python37-32\lib\site-packages\pandas\core\indexes\base.py", line 3078, in get_loc
return self._engine.get_loc(key)
File "pandas\_libs\index.pyx", line 140, in pandas._libs.index.IndexEngine.get_loc
File "pandas\_libs\index.pyx", line 162, in pandas._libs.index.IndexEngine.get_loc
File "pandas\_libs\hashtable_class_helper.pxi", line 1492, in pandas._libs.hashtable.PyObjectHashTable.get_item
File "pandas\_libs\hashtable_class_helper.pxi", line 1500, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: (3, 4)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Users\ME\Desktop\pyBTCstrat\pyBTCstrat.py", line 5, in <module>
summe = data[3,4] + data[3,5]
File "C:\Python37-32\lib\site-packages\pandas\core\frame.py", line 2688, in __getitem__
return self._getitem_column(key)
File "C:\Python37-32\lib\site-packages\pandas\core\frame.py", line 2695, in _getitem_column
return self._get_item_cache(key)
File "C:\Python37-32\lib\site-packages\pandas\core\generic.py", line 2489, in _get_item_cache
values = self._data.get(item)
File "C:\Python37-32\lib\site-packages\pandas\core\internals.py", line 4115, in get
loc = self.items.get_loc(item)
File "C:\Python37-32\lib\site-packages\pandas\core\indexes\base.py", line 3080, in get_loc
return self._engine.get_loc(self._maybe_cast_indexer(key))
File "pandas\_libs\index.pyx", line 140, in pandas._libs.index.IndexEngine.get_loc
File "pandas\_libs\index.pyx", line 162, in pandas._libs.index.IndexEngine.get_loc
File "pandas\_libs\hashtable_class_helper.pxi", line 1492, in pandas._libs.hashtable.PyObjectHashTable.get_item
File "pandas\_libs\hashtable_class_helper.pxi", line 1500, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: (3, 4)
Ich hab keine Ahnung, was das alles bedeutet :(
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da habe ich selbst noch ne Luecke, ich dachte pandas verhaelt sich da wie ein numpy array. Das laesst sich aber leicht beheben:

Code: Alles auswählen

import pandas as pd
import io

DATA = """foo,bar,baz
1,2,3
1,2,3
1,2,3
1,2,3"""
data = pd.read_csv(io.StringIO(DATA)).as_matrix()
print(data)
summe = data[1,2] + data[2,2]

print(summe)
MuMPiTz
User
Beiträge: 27
Registriert: Freitag 27. Juli 2018, 15:07

__deets__ hat geschrieben: Montag 20. August 2018, 19:53 Da habe ich selbst noch ne Luecke, ich dachte pandas verhaelt sich da wie ein numpy array. Das laesst sich aber leicht beheben:

Code: Alles auswählen

import pandas as pd
import io

DATA = """foo,bar,baz
1,2,3
1,2,3
1,2,3
1,2,3"""
data = pd.read_csv(io.StringIO(DATA)).as_matrix()
print(data)
summe = data[1,2] + data[2,2]

print(summe)
Danke!
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei das IMHO fast ein ”Missbrauch” von Pandas ist, wenn man am Ende alles was Pandas-Dataframes ausmachen einfach weg wirft. Dann kann man das auch gleich nur mit `numpy` machen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich hab's tatsaechlich auf die schnelle nicht rausgefunden. Den Spaltennamen zu verwenden hat zumindest nicht geklappt.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Naja doch, man nimmt den Spaltennamen, bekommt dafür das `Series`-Objekt das die Spalte repräsentiert und greift da dann per Index auf die dritte Zeile zu:

Code: Alles auswählen

summe = data[3][2] + data[4][2]
Dein ursprünglicher Zugriff ``data[3, 4]`` würde sich auf einen Multi-Index für die Spalte beziehen. Oder Spalte*n* falls der Multi-Index mehr als zwei Ebenen hat.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also so wie du die eine Zeile Code da hingeschrieben hast geht es fuer mich genau nicht. Das habe ich ja als erstes probiert, nachdem die Komma-basierte Syntax versagt hat.

Was dann geklappt hat ist

summe = data.baz[2] + data.foo[0]

Mir war so als ob ich data["foo"] vergeblich probiert habe, aber gerade gesehen: das geht, was auch immer ich da verbockt habe.

Alles in allem ist das ok, aber ganz ehrlich: das ein namensbezogener Zugriff dem per Index so unbedingt vorzuziehen ist, sehe ich jetzt nicht.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@__deets__: Du hast doch eine Tabelle, in der jede Spalte einen Namen hat. Da ist es ganz natürlich, dass man die Spalte auch per Namen anspricht.

MuMPiTz scheint keinen Header zu haben, da sind dann die „Spaltennamen” Nummern, der Zugriff über Index funktioniert also wie erwartet:

Code: Alles auswählen

data = pd.read_csv(io.StringIO(DATA), header=None)
summe = data[3][2] + data[4][2]
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@__deets__: Du hast ja auch durch die Kopfzeile andere Spaltennamen. Also ich finde sprechende Namen anstelle von magischen Indexzahlen schon besser. Zumal man auch schnell durcheinanderkommen kann wenn man den Index zu einer normalen Spalte macht oder eine normale Spalte als Index verwendet und sich dadurch die Spaltennumerierung ändert. Im Beispiel vom OP fallen die ersten beiden Spalten ja normalerweise weg, weil man die sehr wahrscheinlich zusammengenommen zum Index machen würde.

Wenn man Indexwerte verwenden möchte, kann man das über `iat`: ``summe = data.iat[2, 3] + data.iat[2, 4]``
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten