首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何排查pandas bug/特性?

如何排查pandas bug/特性?
EN

Stack Overflow用户
提问于 2013-02-13 11:57:20
回答 1查看 103关注 0票数 2

我有一个熊猫DataFrame,是这样创建的:

代码语言:javascript
复制
import pandas as pd
wb = pd.io.parsers.ExcelFile('/path/to/data.xlsx')
df = wb.parse(wb.sheet_names[0])

生成的dataframe大约有12列,所有列的长度都完全相同(大约150K)。

对于大多数列,以下操作几乎是即时的

代码语言:javascript
复制
aset = set(df.acolumn)

但对于某些列,相同的操作,例如

代码语言:javascript
复制
aset = set(df.weirdcolumn)

耗时> 10分钟!(或者更确切地说,操作在10分钟超时期限到期之前无法完成。)相同数量的元素!

更奇怪的是:

代码语言:javascript
复制
In [106]: set([type(c) for c in df.weirdcolumn])
Out[106]: set([numpy.float64])

In [107]: df.weirdcolumn.value_counts()
Out[107]: []

该列的内容似乎都是nan

代码语言:javascript
复制
In [118]: all(np.isnan(df.weirdcolumn.values))
Out[118]: True

但这并不能解释前面提到的速度减慢,因为以下操作只需要几秒钟:

代码语言:javascript
复制
In [121]: set([np.nan for _ in range(len(data))])
Out[121]: set([nan])

我已经没有办法找出上面提到的大规模放缓的原因。欢迎提出建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-13 12:10:13

关于nans的一件奇怪的事情是,它们不是平等的。这意味着“不同的”nan对象将被单独插入到集合中:

代码语言:javascript
复制
>>> float('nan') == float('nan')
False
>>> float('nan') is float('nan')
False
>>> len(set([float('nan') for _ in range(1000)]))
1000

这不会发生在您的np.nan测试中,因为它一遍又一遍是同一个对象:

代码语言:javascript
复制
>>> np.nan == np.nan
False
>>> np.nan is np.nan
True
>>> len(set([np.nan for _ in range(1000)]))
1

这可能就是您的问题所在;您正在创建一个150,000个元素集,其中每个元素都有完全相同的散列(hash(float('nan')) == 0)。这意味着将新的nan插入到已经具有n nan的集合中至少需要O(n)时间,因此构建一组N nan至少需要O(N^2)时间。150k^2 is...big。

所以是啊,保姆太烂了。您可以通过执行以下操作来解决此问题

代码语言:javascript
复制
nan_idx = np.isnan(df.weirdcolumn)
s = set(df.weirdcolumn[~nan_idx])
if np.any(nan_idx):
    s.add(np.nan)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14846147

复制
相关文章

相似问题

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