CSV-Datei wird nicht getrennt

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
Chris99
User
Beiträge: 9
Registriert: Donnerstag 12. Juli 2018, 08:03

Hallo liebe Python-Gemeinde,

ich bin neu hier und habe ein Problem beim importieren einer CSV-Datei.
CSV-Datei Herkunft: https://www.kaggle.com/philmohun/crypto ... /version/1

Ich möchte gerne eine CSV-Datei importieren und mir den "Kopf" anzeigen lassen (hat bisher immer funktioniert), leider werden die Daten nicht beim Komma getrennt.
Der "Kopf" wird ausgegeben, die Spaltennamen getrennt, die Daten allerdings nicht.

Hatte von euch schon jemand dieses Problem bzw. hat jemand einen Lösungsvorschlag für mich?

Code: Alles auswählen

import pandas as pd
dataframe = pd.read_csv('consolidated_coin_data.csv', sep=',')
dataframe.head()
Vielen Dank schon mal im Voraus!
Chris99
Sapere aude
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie sehen denn die Daten aus?
Chris99
User
Beiträge: 9
Registriert: Donnerstag 12. Juli 2018, 08:03

Hallo Sirius3,

was meinst du damit "Wie sehen die Daten aus?" ?

Oben ist der Link zu den Daten, da kannst du auch die ersten 200 Reihen sehen.

Fallst du meinst wie der "Kopf" aussieht dann:

Currency Date Open High Low Close Volume Market Cap
0 0x,"Dec 27, 2017",0.648181,0.712597,0.617503... NaN NaN NaN NaN NaN NaN NaN
1 0x,"Dec 26, 2017",0.693401,0.708796,0.563918... NaN NaN NaN NaN NaN NaN NaN
2 0x,"Dec 25, 2017",0.634725,0.717725,0.630453... NaN NaN NaN NaN NaN NaN NaN
3 0x,"Dec 24, 2017",0.651100,0.672352,0.534855... NaN NaN NaN NaN NaN NaN NaN
4 0x,"Dec 23, 2017",0.502023,0.768043,0.485584... NaN NaN NaN NaN NaN NaN NaN

Danke für deine Hilfe :)

LG
Chris99
Sapere aude
Benutzeravatar
__blackjack__
User
Beiträge: 13099
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Chris99: Die Seite will das ich mich anmelde um die CSV-Datei herunter zu laden. Nö.

Das was Du zeigst ist inkonsistent. Der Kopf ist durch Leerzeichen getrennt, die Werte am Anfang jedes Datensatzes durch Kommas und am Ende dann durch Leerzeichen‽
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Chris99
User
Beiträge: 9
Registriert: Donnerstag 12. Juli 2018, 08:03

Hallo _blackjack_ ,
ja, der Kopf wurde bereits richtig getrennt, deshalb sind da keine "," mehr.

Ja das ist mein Problem, die Spaltenüberschriften wurden richtig getrennt, der Rest der getrennt werden sollte wird nicht getrennt und steht unter "Currency".
Das NaN ist auch eine Ausgabe von Python. Normalerweise bzw. Ziel wäre es das der Kopf folgendermaßen aussieht:

Currency Date Open High Low Close Volume Market Cap
0 0x Dec 27, 2017 0.648181 0.712597 0.617503 0.669701 "11,866,800" "306,131,000"
usw.

Hier die ersten 5 Zeilen aus der CSV-Datei:
Currency,Date,Open,High,Low,Close,Volume,Market Cap
0x,"Dec 27, 2017",0.648181,0.712597,0.617503,0.669701,"11,866,800","306,131,000"
0x,"Dec 26, 2017",0.693401,0.708796,0.563918,0.647725,"12,996,000","327,270,000"
0x,"Dec 25, 2017",0.634725,0.717725,0.630453,0.696416,"8,668,880","317,362,000"
0x,"Dec 24, 2017",0.651100,0.672352,0.534855,0.628460,"11,478,700","325,550,000"

Danke nochmal für eure Hilfe!
Sapere aude
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

Mit den 5 Zeilen, die Du gepostet hast, kann ich das Problem nicht nachvollziehen:

Code: Alles auswählen

>>> dataframe
  Currency          Date      Open      High       Low     Close      Volume   Market Cap
0       0x  Dec 27, 2017  0.648181  0.712597  0.617503  0.669701  11,866,800  306,131,000
1       0x  Dec 26, 2017  0.693401  0.708796  0.563918  0.647725  12,996,000  327,270,000
2       0x  Dec 25, 2017  0.634725  0.717725  0.630453  0.696416   8,668,880  317,362,000
3       0x  Dec 24, 2017  0.651100  0.672352  0.534855  0.628460  11,478,700  325,550,000
Chris99
User
Beiträge: 9
Registriert: Donnerstag 12. Juli 2018, 08:03

Hallo Sirius3,

oke danke für die Info, jetzt weiß ich leider gar nicht mehr weiter :(

Ich führe den Code in "Jupyter Notebook" aus, aber das dürfte ja trotzdem nichts daran ändern oder?

Ich habe es schon einige Male probiert, immer mit dem selben Ergebnis. Ich habe es mit den 5 Zeilen auch schon probiert, geht allerdings leider trotzdem nicht.
Wenn ich eine andere Datei einlese funktioniert es, wenn ich dann wieder diese Datei einlesen möchte funktioniert es wieder nicht.

Ich habe keine Ahnung was das Problem ist.

LG und Danke!
Chris99
Sapere aude
Benutzeravatar
__blackjack__
User
Beiträge: 13099
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Also bei mir funktioniert es auch. Wobei man `sep` nicht angeben muss, das Komma ist ja die Voreinstellung. Dafür möchte man vielleicht die Datumsspalte auch parsen lassen und den Tausendertrenner angeben, damit in den letzten beiden Spalten Zahlen stehen und keine Zeichenketten.

Code: Alles auswählen

In [22]: pd.read_csv('test2.csv', parse_dates=['Date'], thousands=',').dtypes
Out[22]: 
Currency              object
Date          datetime64[ns]
Open                 float64
High                 float64
Low                  float64
Close                float64
Volume                 int64
Market Cap             int64
dtype: object

In [23]: pd.read_csv('test2.csv', parse_dates=['Date'], thousands=',')
Out[23]: 
  Currency       Date      Open      High       Low     Close    Volume  \
0       0x 2017-12-27  0.648181  0.712597  0.617503  0.669701  11866800   
1       0x 2017-12-26  0.693401  0.708796  0.563918  0.647725  12996000   
2       0x 2017-12-25  0.634725  0.717725  0.630453  0.696416   8668880   
3       0x 2017-12-24  0.651100  0.672352  0.534855  0.628460  11478700   

   Market Cap  
0   306131000  
1   327270000  
2   317362000  
3   325550000
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Chris99
User
Beiträge: 9
Registriert: Donnerstag 12. Juli 2018, 08:03

Hallo _blackjack_,
ich habe es mal mit deinem Code versucht, aber irgendetwas stimmt leider noch nicht.

Die Datentypen die ich bekommen habe sind:
Currency object
Date datetime64[ns]
Open float64
High float64
Low float64
Close float64
Volume float64
Market Cap float64
dtype: object

denkst du es könnte daran liegen das "Volume und Market Cap" float64 anstatt int64 ist?

PS.: die Ausgabe ist gleich geblieben nut das jetzt unter "Date" anstatt des NaN ein NaT steht. Was bedeutet NaT?

LG
Chris99
Sapere aude
Benutzeravatar
__blackjack__
User
Beiträge: 13099
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Chris99: NaT steht für „not a time(stamp)“. Analog zu NaN („not a number“).

Was sagt denn `pandas.__version__`?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

ohne zu wissen, was Du genau machst, kann man nicht helfen. Solange die Daten nicht richtig gelesen werden, ist es müßig, sich um die Typen Gedanken zu machen.
NaT ist not a time.
Chris99
User
Beiträge: 9
Registriert: Donnerstag 12. Juli 2018, 08:03

Hallo ihr beiden,

nachdem ich ja neu in Python bin, wollte ich mich ein bisschen spielen und mal eine "Tabelle" mit pandas erstell und dannach eine Lineare Regression.
Dazu habe ich mir ein Youtube Video angesehen: https://www.youtube.com/watch?v=sKiNPjkrKg4

Ich habe die Schritte einfach nachgemacht (Daten runter geladen, Code nachgeschrieben) aber bei mir hat es nicht funktioniert, also die "Tabelle" in pandas.
Nachdem ich gegoogelt habe (ohne erfolg) und einen Freund gefragt habe was das sein könnte (auch ohne erfolg), hab ich mich an euch gewendet.

Pandas Version: 0.23.0

LG und Danke :)
Sapere aude
Benutzeravatar
__blackjack__
User
Beiträge: 13099
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mein Pandas war auf diesem Rechner etwas älter, das habe ich jetzt mal auf die aktuelle Version (0.23.3) aktualisiert, aber bis auf eine kleine Änderung an der `repr()`-Darstellung, funktioniert das bei mir immer noch genau so:

Code: Alles auswählen

In [2]: pd.read_csv('test2.csv', parse_dates=['Date'], thousands=',')
Out[2]: 
  Currency       Date      Open     ...         Close    Volume  Market Cap
0       0x 2017-12-27  0.648181     ...      0.669701  11866800   306131000
1       0x 2017-12-26  0.693401     ...      0.647725  12996000   327270000
2       0x 2017-12-25  0.634725     ...      0.696416   8668880   317362000
3       0x 2017-12-24  0.651100     ...      0.628460  11478700   325550000

[4 rows x 8 columns]

In [3]: pd.read_csv('test2.csv', parse_dates=['Date'], thousands=',').dtypes
Out[3]: 
Currency              object
Date          datetime64[ns]
Open                 float64
High                 float64
Low                  float64
Close                float64
Volume                 int64
Market Cap             int64
dtype: object
Entweder liegt es an den Originaldaten, die wir ja nicht haben, oder bei Dir ist irgendetwas anders als bei Sirius3 und mir.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Chris99
User
Beiträge: 9
Registriert: Donnerstag 12. Juli 2018, 08:03

Hi _blackjack_ ,

hmm das es an den Originaldaten liegt glaub ich nicht, ich habe auch schon eine neue Mappe (Kopieren/Einfügen) erstellt und als .csv abgespeichert, hat trotzdem nicht funktioniert.

Ein Freund von mir (Erfahrener Python-Programmierer) hat meinen Code jetzt auch probiert, bei ihm funktioniert es auch nicht.

Danke trotzdem für eure Hilfe!

LG
Chris99
Sapere aude
Benutzeravatar
__blackjack__
User
Beiträge: 13099
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Chris99: Also ich habe das jetzt mit der Originaldatei ausprobiert und musste noch `na_values` hinzunehmen, weil in den letzten beiden Spalten '-' steht wenn kein Wert vorhanden ist, und dann sieht das bei mir so aus:

Code: Alles auswählen

In [25]: df = pd.read_csv('consolidated_coin_data.csv', parse_dates=['Date'], th
    ...: ousands=',', na_values=['-'])

In [26]: df.dtypes
Out[26]: 
Currency              object
Date          datetime64[ns]
Open                 float64
High                 float64
Low                  float64
Close                float64
Volume               float64
Market Cap           float64
dtype: object

In [27]: df.head()
Out[27]: 
  Currency       Date      Open     ...          Close      Volume   Market Cap
0       0x 2017-12-27  0.648181     ...       0.669701  11866800.0  306131000.0
1       0x 2017-12-26  0.693401     ...       0.647725  12996000.0  327270000.0
2       0x 2017-12-25  0.634725     ...       0.696416   8668880.0  317362000.0
3       0x 2017-12-24  0.651100     ...       0.628460  11478700.0  325550000.0
4       0x 2017-12-23  0.502023     ...       0.645686  24164900.0  251012000.0

[5 rows x 8 columns]
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Chris99
User
Beiträge: 9
Registriert: Donnerstag 12. Juli 2018, 08:03

Hallo _blackjack_, Sirius3,

erstmal vielen Dank für eure Hilfe!

@_blackjack_ :
Danke das werd ich mir fürs nächste mal merken!

Ich hab es jetzt nach entlichen Versuchen geschafft und bin auf den Fehler drauf gekommen :)
Das File war (keine Ahnung warum) corrupted, ich habe es dann bei den Komma getrennt, erneut zusammengesetzt und als CSV abgespeichert und jetzt funktioniert es!

LG und Danke nochmal für eure Hilfe!
Chris99
Sapere aude
Chris99
User
Beiträge: 9
Registriert: Donnerstag 12. Juli 2018, 08:03

Hallo _blackjack_, Sirius3!

Danke _blackjack_ das merk ich mir fürs nächste mal :)

Ich habe auch eine Lösung gefunden und zwar:
ich bin drauf gekommen das die CSV-Datei corrupted war (keine Ahnung warum), dh. die ganze Zeile wurde als String ausgegeben, daraufhin habe ich die Daten bei den Komma getrennt und dann in eine neue CSV-Datei umgewandelt. Das hat dann funktioniert :)

Aber nochmal, vielen Dank euch beiden für die großartige unterstützung :)

LG
Chris99
Sapere aude
Antworten