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

时间:2017-09-28 08:12:12

标签: python pandas series

我在excel文件(> 15 MB)的几个工作表中阅读,其中每个工作表都具有> 10000列。我在第二列中选择一个列(仅包含整数),从该列中删除所有值== 0并将此列写入新的df2。另外,我计算了describeie统计数据。

数据如下所示:

react

我使用的代码是:

    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

不幸的是这段代码超级慢...... 有没有更快的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

here获取的数据并已修改。

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

选项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

选项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

选项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

选项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

注意:由于处理列名的限制,queryeval需要执行两个步骤。

选项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

<强>性能

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