2017-09-28 3 views
0

Ich habe mehrere Arbeitsblätter einer Excel-Datei (> 15 MB) gelesen, wo jedes Blatt> 10000 Spalten hat. Ich wähle eine einzelne Spalte (besteht nur aus ganzen Zahlen), lösche alle Werte == 0 aus dieser Spalte und schreibe diese Spalte in eine neue df2. Zusätzlich berechne ich die Beschreibungsstatistik.Schnellste Möglichkeit, Nullen aus einer Pandas-Serie zu entfernen

Daten sieht wie folgt aus:

Gel.Menge Erf.datum  Freig. 
0   0.0 26.11.2014 26.11.2014 
1  10.0 06.11.2014 07.11.2014 
2   5.0 19.12.2014 08.01.2015 
3   7.0 07.07.2015 17.07.2015 
4   0.0 21.07.2015 22.07.2015 
5   5.0 18.03.2016 22.03.2016 
6  10.0 29.03.2016 31.03.2016 
7   0.0 20.07.2016 21.07.2016 
8  20.0 13.10.2016 17.10.2016 
9   0.0 01.12.2014 01.12.2014 
10  0.0 20.04.2015 20.04.2015 

Der Code, den ich verwenden ist:

inpath=r"P:\Data.xlsx" 

df1=pd.DataFrame() 

for i in ["67059070","67059075","67060055","Screwing Total"]: 
    df=pd.read_excel(io=inpath,header=0,sheetname="{0}".format(i)) 
    df1["Gel.Menge"]=df["Gel.Menge"].where(df["Gel.Menge"]!=0).dropna() 
    print(np.round(df1.mode()))  
    print(np.round(df1.describe()) 

Leider ist dieser Code super langsam ... gibt es einen schnelleren Weg, dies zu erreichen?

+0

Genug 'df zu tun [df [ "Gel.Menge"]! = 0]' –

+1

Oder 'df.query ("Gel.Menge! = 0") ', oder' df [df.eval ("Gel.Menge! = 0")] ' –

+0

Ich vermisse die Beispieldaten. Alle obigen Kommentare würden eine gute Antwort geben. – Dark

Antwort

1

Daten aus here entnommen und modifiziert.

df 

    Gel.Menge Erf.datum  Freig. 
0   0.0 26.11.2014 26.11.2014 
1  10.0 06.11.2014 07.11.2014 
2   5.0 19.12.2014 08.01.2015 
3   7.0 07.07.2015 17.07.2015 
4   0.0 21.07.2015 22.07.2015 
5   5.0 18.03.2016 22.03.2016 
6  10.0 29.03.2016 31.03.2016 
7   0.0 20.07.2016 21.07.2016 
8  20.0 13.10.2016 17.10.2016 
9   0.0 01.12.2014 01.12.2014 
10  0.0 20.04.2015 20.04.2015 

Option 1
boolean indexing

df[df['Gel.Menge'] != 0] 

    Gel.Menge Erf.datum  Freig. 
1  10.0 06.11.2014 07.11.2014 
2  5.0 19.12.2014 08.01.2015 
3  7.0 07.07.2015 17.07.2015 
5  5.0 18.03.2016 22.03.2016 
6  10.0 29.03.2016 31.03.2016 
8  20.0 13.10.2016 17.10.2016 

Option 2
np.where

m = np.where(df['Gel.Menge'], True, False) 
m 
array([False, True, True, True, False, True, True, False, True, 
     False, False], dtype=bool) 

df[m] 

    Gel.Menge Erf.datum  Freig. 
1  10.0 06.11.2014 07.11.2014 
2  5.0 19.12.2014 08.01.2015 
3  7.0 07.07.2015 17.07.2015 
5  5.0 18.03.2016 22.03.2016 
6  10.0 29.03.2016 31.03.2016 
8  20.0 13.10.2016 17.10.2016 

Option 3
df.query

c = df['Gel.Menge'] 
df.query('@c != 0') 

    Gel.Menge Erf.datum  Freig. 
1  10.0 06.11.2014 07.11.2014 
2  5.0 19.12.2014 08.01.2015 
3  7.0 07.07.2015 17.07.2015 
5  5.0 18.03.2016 22.03.2016 
6  10.0 29.03.2016 31.03.2016 
8  20.0 13.10.2016 17.10.2016 

Option 4
df.eval

df[df.eval('@c != 0')] 

    Gel.Menge Erf.datum  Freig. 
1  10.0 06.11.2014 07.11.2014 
2  5.0 19.12.2014 08.01.2015 
3  7.0 07.07.2015 17.07.2015 
5  5.0 18.03.2016 22.03.2016 
6  10.0 29.03.2016 31.03.2016 
8  20.0 13.10.2016 17.10.2016 

Hinweis: Zwei Schritte sind notwendig für query und eval aufgrund der Einschränkungen bei der Handhabung Spaltennamen.


Option 5
astype(bool)

df[df['Gel.Menge'].astype(bool)] 

    Gel.Menge Erf.datum  Freig. 
1  10.0 06.11.2014 07.11.2014 
2  5.0 19.12.2014 08.01.2015 
3  7.0 07.07.2015 17.07.2015 
5  5.0 18.03.2016 22.03.2016 
6  10.0 29.03.2016 31.03.2016 
8  20.0 13.10.2016 17.10.2016 

Leistung

print(df.shape) 
(110000, 3) 
100 loops, best of 3: 2.4 ms per loop
100 loops, best of 3: 2.36 ms per loop
100 loops, best of 3: 4.79 ms per loop
100 loops, best of 3: 4.97 ms per loop
100 loops, best of 3: 2.08 ms per loop
+0

Also, was ist der schnellste Weg? – Zero

+0

@Zero Ich hatte Recht. Option 5 ist die schnellste, gefolgt von 2, 1, 3 und 4. –

Verwandte Themen