对于“大量”的群组,过滤Pandas数据帧会变慢吗?

时间:2014-08-13 00:42:08

标签: python pandas

我有一个大约有20万行的数据帧,我正在尝试过滤如下:

>>> df.groupby(key).filter(lambda group: len(group) > 100)

其中key是列的列表。当指定的密钥将数据帧划分为800个左右的组时,这将在大约3秒内运行。但是,如果我向密钥添加另一列,将组数增加到2500左右,执行会耗尽我的所有内存并基本上崩溃我的系统,除非我终止脚本。

我可以通过迭代组来做同样的事情,但与上面的单行相比它很笨拙,让我想知道为什么滤波器功能如此有限。

有人可以向我解释是否可以预料到,如果是这样,为什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

这在某种程度上取决于团体的数量,但必须为您做其他事情。这很快。

In [10]: N = 1000000

In [11]: ngroups = 1000

In [12]: df = DataFrame(dict(A = np.random.randint(0,ngroups,size=N),B=np.random.randn(N)))

In [13]: %timeit df.groupby('A').filter(lambda x: len(x) > 1000)
1 loops, best of 3: 431 ms per loop

In [14]: df.groupby('A').filter(lambda x: len(x) > 1000).info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 508918 entries, 0 to 999997
Data columns (total 2 columns):
A    508918 non-null int64
B    508918 non-null float64
dtypes: float64(1), int64(1)
In [15]: df = DataFrame(dict(A = np.random.randint(0,10,size=N),B=np.random.randn(N)))

In [16]: %timeit df.groupby('A').filter(lambda x: len(x) > 1000)
1 loops, best of 3: 182 ms per loop

In [17]: df.groupby('A').filter(lambda x: len(x) > 1000).info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1000000 entries, 0 to 999999
Data columns (total 2 columns):
A    1000000 non-null int64
B    1000000 non-null float64
dtypes: float64(1), int64(1)

答案 1 :(得分:0)

我找到了解决方案。其中一列包含我表示为Timestamp对象的日期。当我将Timestamp对象转换为字符串时,分组工作很快就没有问题!