从熊猫系列中删除零的最快方法

2Ob*_*Obe 2 python series pandas

我阅读了一个 excel 文件(> 15 MB)的几个工作表,其中每个工作表都有 > 10000 列。其次,我选择一列(仅由整数组成),从该列中删除所有值 == 0 并将此列写入新的 df2。此外,我计算了描述性统计数据。

数据如下所示:

    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
Run Code Online (Sandbox Code Playgroud)

我使用的代码是:

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())
Run Code Online (Sandbox Code Playgroud)

不幸的是,这段代码非常慢......有没有更快的方法来完成这个?

cs9*_*s95 5

这里获取并修改的数据。

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
Run Code Online (Sandbox Code Playgroud)

选项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
Run Code Online (Sandbox Code Playgroud)

选项 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
Run Code Online (Sandbox Code Playgroud)

选项 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
Run Code Online (Sandbox Code Playgroud)

选项 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
Run Code Online (Sandbox Code Playgroud)

:两个步骤是必要的query,并eval由于与处理列名的限制。


选项 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
Run Code Online (Sandbox Code Playgroud)

表现

print(df.shape)
(110000, 3)
Run Code Online (Sandbox Code Playgroud)
100 loops, best of 3: 2.4 ms per loop
Run Code Online (Sandbox Code Playgroud)
100 loops, best of 3: 2.36 ms per loop
Run Code Online (Sandbox Code Playgroud)
100 loops, best of 3: 4.79 ms per loop
Run Code Online (Sandbox Code Playgroud)
100 loops, best of 3: 4.97 ms per loop
Run Code Online (Sandbox Code Playgroud)
100 loops, best of 3: 2.08 ms per loop
Run Code Online (Sandbox Code Playgroud)