Daten mit panda einlesen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
ribon431
User
Beiträge: 9
Registriert: Donnerstag 4. Februar 2021, 14:50

Guten Tag,

Ich bin ein Python neuling, habt bitte erbarmen.

ich möchte eine csv einlesen mit 25_000 Zeilen und 1800 Spalten.
In dieser CSV sind:
- nur numerische Werte
- ein paar Zellen in der csv haben jedoch den Wert "#Name?"
- in der csv sind die Zahlen mit einem Komma getrennt und teilweise mit E+ und E-

mein code sieht folgendermaßen aus und funktioniert:

Code: Alles auswählen

[/import pandas as pd

#%% Daten einlesen

link = 'xy.csv'  
df = pd.read_csv(link,sep=';',engine='python', decimal=",")

#%% String -> Float64  für alle Spalten

zähler=0
for x in df.dtypes[:df.shape[1]]:
    if x == object:
        for i in range(df.shape[0]):
            df.iloc[i,zähler]=df.iloc[i,zähler].replace(',','.')
            if  df.iloc[i,zähler]=='#NAME?':
                df.iloc[i,zähler]='nan'
        df[df.columns[zähler]]=df[df.columns[zähler]].astype('float')            
    zähler+=1]
    
Jedoch braucht der Code 1 Stunde und 50 minuten, wobei die csv schon in 2min eingelesen wird.
Was kann ich denn verbessern, oder wo kann ich schnellere funktionen einsetzen ?
Vielen Dank im Vorraus !
viele Grüße
Ribon
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn man for-Schleifen mit pandas kombiniert, macht man etwas falsch.
Und engine='python' sorgt auch dafür, dass das Einlesen mit 2 Minuten so extrem lange dauert.
read_csv hat für Deinen Fall schon das passende Argument.

Code: Alles auswählen

df = pd.read_csv(link, sep=";", decimal=",", dtype=float, na_values=["#NAME?"])
ribon431
User
Beiträge: 9
Registriert: Donnerstag 4. Februar 2021, 14:50

Sirius3 hat geschrieben: Donnerstag 4. Februar 2021, 16:23 Wenn man for-Schleifen mit pandas kombiniert, macht man etwas falsch.
Und engine='python' sorgt auch dafür, dass das Einlesen mit 2 Minuten so extrem lange dauert.
read_csv hat für Deinen Fall schon das passende Argument.

Code: Alles auswählen

[df = pd.read_csv(link, sep=";", decimal=",", dtype=float, na_values=["#NAME?"])
Danke für die schnelle Antwort, jetzt zeigt Python jedoch folgende Fehlermeldung:

Code: Alles auswählen

 
runcell(0, 'C:\Users\unbenannt16.py')
Thu Feb  4 16:43:53 2021
Traceback (most recent call last):

  File "pandas\_libs\parsers.pyx", line 1151, in pandas._libs.parsers.TextReader._convert_tokens

TypeError: Cannot cast array from dtype('O') to dtype('float64') according to the rule 'safe'


During handling of the above exception, another exception occurred:

Traceback (most recent call last):

  File "C:\Users\unbenannt16.py", line 15, in <module>
    dfx = pd.read_csv(link, sep=";", decimal=",", dtype=float, na_values=["#NAME?"])

  File "C:\Program Files\Anaconda3_E2020\lib\site-packages\pandas\io\parsers.py", line 676, in parser_f
    return _read(filepath_or_buffer, kwds)

  File "C:\Program Files\Anaconda3_E2020\lib\site-packages\pandas\io\parsers.py", line 454, in _read
    data = parser.read(nrows)

  File "C:\Program Files\Anaconda3_E2020\lib\site-packages\pandas\io\parsers.py", line 1133, in read
    ret = self._engine.read(nrows)

  File "C:\Program Files\Anaconda3_E2020\lib\site-packages\pandas\io\parsers.py", line 2037, in read
    data = self._reader.read(nrows)

  File "pandas\_libs\parsers.pyx", line 859, in pandas._libs.parsers.TextReader.read

  File "pandas\_libs\parsers.pyx", line 874, in pandas._libs.parsers.TextReader._read_low_memory

  File "pandas\_libs\parsers.pyx", line 951, in pandas._libs.parsers.TextReader._read_rows

  File "pandas\_libs\parsers.pyx", line 1083, in pandas._libs.parsers.TextReader._convert_column_data

  File "pandas\_libs\parsers.pyx", line 1157, in pandas._libs.parsers.TextReader._convert_tokens

ValueError: could not convert string to float: '90574,3' 
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

Zeige ein Minimal lauffähiges Beispiel inklusive Inputdaten, damit wir das nachvollziehen können.
ribon431
User
Beiträge: 9
Registriert: Donnerstag 4. Februar 2021, 14:50

Verstehe nicht ganz, was du damit meinst.
Soll ich einen kleinen Ausschnitt aus meiner csv als csv hier posten ?
Sirius3 hat geschrieben: Donnerstag 4. Februar 2021, 16:54 Zeige ein Minimal lauffähiges Beispiel inklusive Inputdaten, damit wir das nachvollziehen können.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

Eben den Ausschnitt, der den von Dir gezeigten Fehler produziert.
ribon431
User
Beiträge: 9
Registriert: Donnerstag 4. Februar 2021, 14:50

Die erste Zelle , die den Fehler verursacht habe ich in dem Bild gelb markiert.

Bild: https://share.icloud.com/photos/0tBgFjY ... Jgduq-87zg

Als code habe ich nur die Zeile ausgeführt.

Code: Alles auswählen

import pandas as pd

link = 'Test.csv'  
dfx = pd.read_csv(link, sep=";", decimal=",", dtype=float, na_values=["#NAME?",'nan'])
Sirius3 hat geschrieben: Donnerstag 4. Februar 2021, 17:22 Eben den Ausschnitt, der den von Dir gezeigten Fehler produziert.
ribon431
User
Beiträge: 9
Registriert: Donnerstag 4. Februar 2021, 14:50

Vielleicht hilft das noch weiter, hier nochmal alles zusammengefasst.

Die Test.csv Datei sieht folgendermmaßen aus (aus Editor copy und paste):

A;B;C;D;E
0;0;nan ;0;0
0;0;nan ;0;0
0;0;nan ;0;0
0;0;99994,2;0;0
0;0;99976,7;0;0
0;0;99973,7;0;0
0;0;99973,2;0;0
0;0;99961,8;0;0
0;0;99958,5;0;0
118476;124464;99944,1;100129;99213,4
0;0;99943,5;0;0
0;0;99941,1;0;0
0;0;#NAME?;0;0
329476;377604;99934,3;113119;98933,5
0;0;99934,3;0;0
0;0;99912,6;0;0
0;0;99912,6;0;0
445309;511857;99890,3;123773;98871,4
0;0;1,04E+06;0;0
0;0;1,03E+06;0;0
0;0;1,01E+06;0;0
488017;560784;991210;128420;98836,8
0;0;989101;0;0
0;0;975643;0;0
0;0;968111;0;0
547193;628078;959356;135504;98780,4
0;0;916517;0;0
0;0;915653;0;0

der code den ich ausführe sieht so aus:

Code: Alles auswählen

import pandas as pd

link = 'Test.csv'  
dfx = pd.read_csv(link, sep=";", decimal=",", dtype=float, na_values=["#NAME?",'nan'])
und die Fehlermeldung, die ich erhalte so :

Code: Alles auswählen

runcell(0, 'C:/Users/y/unbenannt18.py')
Traceback (most recent call last):

  File "pandas\_libs\parsers.pyx", line 1151, in pandas._libs.parsers.TextReader._convert_tokens

TypeError: Cannot cast array from dtype('O') to dtype('float64') according to the rule 'safe'


During handling of the above exception, another exception occurred:

Traceback (most recent call last):

  File "C:\Users\y\unbenannt18.py", line 12, in <module>
    dfx = pd.read_csv(link, sep=";", decimal=",", dtype=float, na_values=["#NAME?",'nan'])

  File "C:\Program Files\Anaconda3_E2020\lib\site-packages\pandas\io\parsers.py", line 676, in parser_f
    return _read(filepath_or_buffer, kwds)

  File "C:\Program Files\Anaconda3_E2020\lib\site-packages\pandas\io\parsers.py", line 454, in _read
    data = parser.read(nrows)

  File "C:\Program Files\Anaconda3_E2020\lib\site-packages\pandas\io\parsers.py", line 1133, in read
    ret = self._engine.read(nrows)

  File "C:\Program Files\Anaconda3_E2020\lib\site-packages\pandas\io\parsers.py", line 2037, in read
    data = self._reader.read(nrows)

  File "pandas\_libs\parsers.pyx", line 859, in pandas._libs.parsers.TextReader.read

  File "pandas\_libs\parsers.pyx", line 874, in pandas._libs.parsers.TextReader._read_low_memory

  File "pandas\_libs\parsers.pyx", line 951, in pandas._libs.parsers.TextReader._read_rows

  File "pandas\_libs\parsers.pyx", line 1083, in pandas._libs.parsers.TextReader._convert_column_data

  File "pandas\_libs\parsers.pyx", line 1157, in pandas._libs.parsers.TextReader._convert_tokens

ValueError: could not convert string to float: '99994,2'
 
Habe sehr sehr viel gegoogelt, aber finde nichts.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

Jetzt, wo Du endlich die Daten gepostet hast, sieht man, dass Deine na_values falsch sind.
Man muß sie wirklich exakt richtig angeben.

Code: Alles auswählen

dfx = pd.read_csv(link, sep=";", decimal=",", dtype=float, na_values=["#NAME?",'nan '])                                                                
ribon431
User
Beiträge: 9
Registriert: Donnerstag 4. Februar 2021, 14:50

Vielen Dank !

bei der Test.csv klappt es nun auch bei mir endlich.
Aber die große csv, zeigt immer noch fehler.
Ich denke mal, dass da einige na_Values sind welche mit ["#NAME?",'nan '] nicht abgefangen werden.
Besteht die Möglichkeit, dass die Funktion pd.read Werte, die nicht konvertiert werden können, auf na_values setzt ?
Aber finde das komisch, da mein erster code, der knapp 2h lief, ja funktioniert hat.

Sirius3 hat geschrieben: Donnerstag 4. Februar 2021, 18:28 Jetzt, wo Du endlich die Daten gepostet hast, sieht man, dass Deine na_values falsch sind.
Man muß sie wirklich exakt richtig angeben.

Code: Alles auswählen

dfx = pd.read_csv(link, sep=";", decimal=",", dtype=float, na_values=["#NAME?",'nan '])                                                                
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

Woher kommen denn die Zahlen? Warum gibt es da so unterschiedliche kaputte Zellen?
ribon431
User
Beiträge: 9
Registriert: Donnerstag 4. Februar 2021, 14:50

Die Zahlen wurden aus Mops exportiert.
Habe noch ein na_ Value gefunden und mit na_values=["#NAME?",'nan ','inf ']
hat es nun geklappt.
Sirius3 hat geschrieben: Donnerstag 4. Februar 2021, 21:04 Woher kommen denn die Zahlen? Warum gibt es da so unterschiedliche kaputte Zellen?
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

Du brauchst nicht immer den kompletten Beitrag zu zitieren, der steht ja schon direkt darüber.
Antworten