首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从熊猫系列中取零的最快方法

从熊猫系列中取零的最快方法
EN

Stack Overflow用户
提问于 2017-09-28 08:12:11
回答 1查看 6.3K关注 0票数 2

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

数据如下:

代码语言:javascript
复制
    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

我使用的代码是:

代码语言:javascript
复制
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())

不幸的是这段代码太慢了..。有更快的方法来完成这个任务吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-28 08:33:26

数据从here获取并修改。

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

https://stackoverflow.com/questions/46464135/fastest-way-of-dropping-0-values-from-series#comment79883357_46464135

代码语言:javascript
复制
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

性能

代码语言:javascript
复制
print(df.shape)
(110000, 3)
代码语言:javascript
复制
100 loops, best of 3: 2.4 ms per loop
代码语言:javascript
复制
100 loops, best of 3: 2.36 ms per loop
代码语言:javascript
复制
100 loops, best of 3: 4.79 ms per loop
代码语言:javascript
复制
100 loops, best of 3: 4.97 ms per loop
代码语言:javascript
复制
100 loops, best of 3: 2.08 ms per loop
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46464135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档