2017-09-28 1 views
0

J'ai lu dans plusieurs feuilles de calcul d'un fichier Excel (> 15 Mo) où chaque feuille contient> 10000 colonnes. Sencondly Je choisis une seule colonne (composée de seulement des entiers), dépose toutes les valeurs == 0 de cette colonne et écris cette colonne à un nouveau df2. De plus, je calcule les statistiques descriptie.Le moyen le plus rapide de supprimer des zéros d'une série pandas

données ressemble à ceci:

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 

Le code que j'utilise est:

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()) 

Malheureusement ce code est super lent ... est-il un moyen plus rapide d'y arriver?

+0

De quoi faire 'df [df [ "Gel.Menge"]! = 0]' –

+1

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

+0

Les données d'échantillon me manquent. Tous les commentaires ci-dessus feraient une bonne réponse. – Dark

Répondre

1

Données tirées de here et modifiées.

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 

Remarque: Deux étapes sont nécessaires pour query et eval en raison des restrictions avec les noms de colonnes de manutention.


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 

Performance

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

Alors, quel est le moyen le plus rapide? – Zero

+0

@Zero J'avais raison. L'option 5 est la plus rapide, suivie de 2, 1, 3 et 4. –