2014-12-19 16 views
4

有没有一种简单的方法/模块可以在Python中对数据集进行分组操作,因为数据集太大而不适合内存?Group对于大型数据集的操作

我通常会使用熊猫,但它打破了大型数据集。

+0

[this](http://stackoverflow.com/questions/773/how-do-i-use-pythons-itertools-groupby)和[this](https:// docs。 python.org/2/library/itertools.html)可能会有所帮助。 – Ujjwal 2014-12-19 05:04:03

+1

也许你可以使用sqlite3.exe来聚合核心外的数据 – steboc 2014-12-19 10:15:42

回答

5

在评论中,@steboc提到使用sqlite作为可能的解决方案。你可以使用任何数据库作为后端,但sqlite相当快,并且几乎需要设置为零。下面是写了一堆垃圾,以SQLite的整组回读的例子:

开始装载了几包,并设置环境:

import pandas as pd 
import sqlite3 
import string 


## connect to a db. This db will be created if it does not exist 
conn = sqlite3.connect('example.db') 
c = conn.cursor() 

np.random.seed(123) 
## create some random data in a pandas dataframe 
n = 1000000 
c = 10 

通过30次,每次我们让我们的循环将创建一个1毫米记录,10个数字字段和一个简单的字母键的数据框。我们将在sqlite数据库中戳该数据框。在循环结束时,我们的数据库中将有30毫米的行。这发生在我的MBP约15分:

%%time 
for i in arange(30): 
    df = pd.DataFrame(np.random.randn(n, c), columns=list(map(chr, range(65, 65+c)))) 
    df['key'] = string.ascii_letters[i] 
    df.to_sql(name='test_table', if_exists='append', con=conn) 

现在,如果我们要对在该领域key值所有这些数据分组做的操作,我们会首先需要获得所有的唯一值键。一种方法是做到这一点:

%%time 
keys_df = pd.read_sql(sql='SELECT DISTINCT key FROM test_table', con=conn) 
keys_df 

现在我们keys_df这是用含有'关键”的所有唯一值一列的数据帧。现在我们可以遍历每个组,并从数据库中仅提取该组并从中进行分组操作。这里的例子确实微不足道的描述():

%%time 
for row in keys_df.iterrows(): 
    tempdf = pd.read_sql(sql='SELECT * FROM test_table WHERE key=\'' + row[1][0] + '\';', con=conn) 
    ## do anything you want with your group here. 
    ## we'll print describe just for fun 
    print tempdf.describe() 
    print "" 

很显然,在现实生活中,你会放值的数据结构。

我希望这有助于说明如何使用sqlite和熊猫来遍历数据组。

3

Blaze项目很乐意通过分块数据集,然后在每个块上使用Pandas来管理大型数据集。 Blaze out-of-core docs可能会让你感兴趣。这里是NYC Taxi数据集上的explicit example

如果您更喜欢较慢的纯python解决方案,那么toolz项目可能会让您感兴趣。这里是它的文档streaming analytics

+0

不推荐使用仅链接答案的好例子。这些链接中只有三分之一持续了18个月的间隔。也许:http://blaze.readthedocs.io/en/latest/index.html – 2016-07-09 16:21:47

相关问题